Ext JS - Learning Center

Tutorial:Application Layout 程式開發入門介紹

From Learn About the Ext JavaScript Library

Jump to: navigation, search
Summary: Application_Layout_程式開發入門介紹
Author: www.extjs.com.tw
Published: 2007/02/10
Ext Version: 1.1+
Languages: cn.png Chinese

今天要介紹的是初級的觀念,是關於Application Layout的話題,所謂的Application Layout就是你在撰寫程式的時候,如何決定你程式碼的風格,讓它具備有相當的易讀性。這樣做的好處,一來是在團隊裡面如果程式碼風格固定,別人要接手或支援你的專案會比較容易。二來如果以後你要修改程式,也必較容易。以我來說,由於每天開發實在很大,一周前寫的程式自己都越覺得很陌生。好啦,廢話不多說,至接近入正題。

一開始我們些略過JavaScript兩種建立物件的方法,我先把大概介紹一下,但是這篇文章不會談論到這個部分。

方法一是:


var MyObject = function(){
	/*Your Code Here*/
};

方法二是:


var MyObject = function(){
	return{
	/*Your Code Here*/
	}
}();

好,今天我們介紹的Application Layout是許多Javascript設計師常用的架構,當然每個人都又自己的偏好。不過我觀察到一個趨勢,今天介紹的架構是最受許多人歡迎的。


MyObject = function() {
	// private variables : 私有屬性或稱為區域變數
    // private functions : 私有方法或稱為區域方法
    // public space
    return {
        // public properties, e.g. strings to translate : 公有屬性或稱為公開變數

        // public methods : 公有方法或稱為公開方法
        init: function() {
            alert('Application successfully initialized');
        }
    };
}(); // 

上面一堆提到一堆公有/私有,公開/區域..等名詞都是翻譯的問題。我個人還是比較喜歡用英文來稱呼。

上面的架構已經把private 與public 的位置規劃出來了,所以如果把程式碼都放到正確的位置上,大致的架構應該如下


MyObject = function() {
	var myFirstName='Jack';
	var myLastName='Slocum'; //sorry jack : )

    function getFirstName(){
		alert(myFirstName);
	}
	function getLastName(){
		alert(myLastName);
	}
    return {
		NickName1: 'Super Jack',
		NickName2: 'Good Futher Jack',
        init: function() {
            alert(this.NickName1); //在Public zone裡面的需要使用this.xxxx來存取變數
			alert(myFirstName);    //在Public zone裡面的直接使用 xxx來存取  private zone裡面的變數
        },
		other : function(){
			alert(this.NickName2); //在Public zone裡面的需要使用this.xxxx來存取變數
			alert(myLastName);    //在Public zone裡面的直接使用 xxx來存取  private zone裡面的變數
		}  //注意結尾的,需要去除不然龜毛的IE會拒絕執行
    };
}(); // 

有幾點重點要提供給新手注意,這也是我剛學習Javascipt會遇到的疑惑與困擾。
第一個是變數的宣告方式:
在Private zone的變數使用分號(;)隔開舉例如下:


	var 變數1;
	var 變數2;

但是在Public zone裡面的變數要使用逗號(,)隔開(註:其實這是JSON寫法的變型)舉例如下:


	變數1:變數1的值,
	變數2:變數2的值  //注意結尾的逗點在IE無法通過檢查

第二個是function(或稱方法)的宣告方式:
在Private zone的使用方法如下:


	 function fun1(){
		/*Your code HERE*/
	 };
	 function fun2(){
		/*Your code HERE*/
	 }; 

在但是在Public zone的使用方法如下,(註:還這是JSON寫法的變型):


	fun1: function() {
	        /*Your code HERE*/
	},
	fun2: function() {
	        /*Your code HERE*/
	}

最後我們來改寫Ajax XML data 的範例。
原始的程式如下,他是在Ext.onReady()裡面處理全部的工作:


	/*
	 * Ext JS Library 1.1.1
	 * Copyright(c) 2006-2007, Ext JS, LLC.
	 * licensing@extjs.com
	 *
	 * http://www.extjs.com/license
	 */

	Ext.onReady(function(){
	    // create the Data Store
	    var ds = new Ext.data.Store({
	        // load using HTTP
	        proxy: new Ext.data.HttpProxy({url: 'sheldon.xml'}),
	        // the return will be XML, so lets set up a reader
	        reader: new Ext.data.XmlReader({
	               // records will have an "Item" tag
	               record: 'Item',
	               id: 'ASIN',
	               totalRecords: '@total'
	           }, [
	               // set up the fields mapping into the xml doc
	               // The first needs mapping, the others are very basic
	               {name: 'Author', mapping: 'ItemAttributes > Author'},
	               'Title', 'Manufacturer', 'ProductGroup'
	           ])
	    });

	    var cm = new Ext.grid.ColumnModel([
		    {header: "Author", width: 120, dataIndex: 'Author'},
			{header: "Title", width: 180, dataIndex: 'Title'},
			{header: "Manufacturer", width: 115, dataIndex: 'Manufacturer'},
			{header: "Product Group", width: 100, dataIndex: 'ProductGroup'}
		]);
	    cm.defaultSortable = true;
	    // create the grid
	    var grid = new Ext.grid.Grid('example-grid', {
	        ds: ds,
	        cm: cm
	    });
	    grid.render();
	    ds.load();
	});

我們可以把它改寫如下,在我的規劃裡面,我把ds,cm,sm分別放在Private的function裡面處理,當然您也可以自己規劃自己的架構。


	var MyGrid=function(){
		var sm;
		var ds;
		var cm;
		var grid;
		/**
		* 初始化 sm: RowSelectionModel
		*/
		function bulide_sm(){
			sm = new Ext.grid.RowSelectionModel({singleSelect:true});
		}
		/**
		* 初始化ds: Datasource
		*/
		function bulder_ds(){
			ds = new Ext.data.Store({
				// load using HTTP
				proxy: new Ext.data.HttpProxy({url: 'sheldon.xml'}),

				// the return will be XML, so lets set up a reader
				reader: new Ext.data.XmlReader({
					   // records will have an "Item" tag
					   record: 'Item',
					   id: 'ASIN',
					   totalRecords: '@total'
				   }, [
					   // set up the fields mapping into the xml doc
					   // The first needs mapping, the others are very basic
					   {name: 'Author', mapping: 'ItemAttributes > Author'},
					   'Title', 'Manufacturer', 'ProductGroup'
				   ])
			});
		}
		/**
		* 初始化cm: ColumnModel
		*/
		function bulder_cm(){
			cm = new Ext.grid.ColumnModel([
				{header: "Author", width: 120, dataIndex: 'Author'},
				{header: "Title", width: 180, dataIndex: 'Title'},
				{header: "Manufacturer", width: 115, dataIndex: 'Manufacturer'},
				{header: "Product Group", width: 100, dataIndex: 'ProductGroup'}
			]);
			cm.defaultSortable = true;
		}
		return{
			init : function(){
				bulder_cm();
				bulide_sm();
				bulder_ds();
				this.init_grid(); //產生gird
				ds.load();
			},
			init_grid : function(){
			    // create the grid
				grid = new Ext.grid.Grid('example-grid', {
					ds: ds,
					cm: cm,
			        selModel:sm,
			        enableColLock:false,
			        loadMask: true
				});
				grid.render();
			}
		}
	}();

最後,我們使用 來載入們剛剛寫好的物件。


	Ext.onReady(XmlGrid.init,XmlGrid,true);

這樣做也許有人會覺得多此一舉,但是到程式開發的後期,你一定會遇到更複雜的架構,好比說一個Ext.Gird跟Ext.form互動,結構化的好處是以後再Javasript的開發上,你能將一個個的物件獨立出來,方便後期的修改與模組化。
我以後會發表Grid與form同步的教學文章。那時您大概就會了使用這個Application Layout的好處了。

  • This page was last modified 07:47, 13 August 2008.
  • This page has been accessed 2,136 times.