學習EXT第二天:EXT簡介(二)

使用Widgets

(Widget原意爲“小器件”,現指頁面中UI控件)

除了我們已經討論過的核心JavaScript庫,現在的Ext亦包括了一系列的最前端的JavaScirptUI組件庫。文本以一個最常用的widget爲例子,作簡單的介紹。

MessageBox

比起略爲沉悶的“HelloWolrd”消息窗口,我們做少許變化,前面我們寫的代碼是,單擊某個段落便會高亮顯示,現在是單擊段落,在消息窗口中顯示段落內容出來。
在上面的paragraphClicked的function中,將這行代碼:

 Ext.get(e.target).highlight();

 替換爲:

var paragraph = Ext.get(e.target);
paragraph.highlight();
Ext.MessageBox.show({
 title: 
'Paragraph Clicked',
 msg: paragraph.dom.innerHTML,
 width:
400,
 buttons: Ext.MessageBox.OK,
 animEl: paragraph
});

這裏有些新的概念討論一下。在第一行中我們創建了一個局部變量(Local Variable)來保存某個元素的引用,即被單擊的那個DOM節點(本例中,我們總是段落paragrah,事因我們已經定義該事件與<p>標籤發生關聯的了)。爲什麼要這樣做呢?嗯...觀察上面的代碼,我們需要引用同一元素來高亮顯示,在MessageBox中也是引用同一元素作爲參數使用。
一般來說,多次重複使用同一值(Value)或對象,是一個不好的方式,所以,作爲一個好的OOP開發者,應該是將其分配到一個局部變量中,反覆使用這變量!

現在,觀察MessageBox的調用,準備作爲闡述新概念的演示用。乍一看,這像一連串的參數傳入到方法中,但仔細看,這是一個非常特別的語法。實際上,傳入到MessageBox.show的只有一個參數:一個Object literal,包含一組屬性和屬性值。在Javascript中,Object Literal是動態的,你可在任何時候用{和}創建一個典型的對象(object)。其中的字符由一系列的name/value組成的屬性,屬性的格式是[property name]:[property value]。在整個Ext中,你將會經常遇到這種模式的語法,因此你應該消耗掉這知識!
使用Object Literal的原因是什麼呢?主要的原因是“韌性(flexibility)",隨時可新增、刪除屬性,亦可不管順序地插入。而方法不需要改變。這也是多個參數的情況下,爲最終開發者帶來不少的方便(本例中的MessageBox.show())。例如,我們說這兒的foo.action方法,有四個參數,而只有一個是你必須傳入的。本例中,你想像中的代碼可能會是這樣的foo.action(null, null, null, 'hello').,若果那方法用Object Literal來寫,卻是這樣, foo.action({ param4: 'hello' }),這更易用和易讀。

Gird

Gird是Ext中人們最想先睹爲快的Widgets之一,也是最流行之一。好,讓我們看看怎麼輕鬆地創建一個Gird並運行。用下列代碼替換ExtStart.js中全部語句:

 

        <script language="javascript">    
        Ext.onReady(
function() {
            
var myData = [
            [
'Apple',29.89,0.24,0.81,'9/1 12:00am'],
            [
'Ext',83.81,0.28,0.34,'9/12 12:00am'],
            [
'Google',71.72,0.02,0.03,'10/1 12:00am'],
            [
'Microsoft',52.55,0.01,0.02,'7/4 12:00am'],
            [
'Yahoo!',29.01,0.42,1.47,'5/22 12:00am']
            ];

            
var ds = new Ext.data.Store({
                proxy: 
new Ext.data.MemoryProxy(myData),
                reader: 
new Ext.data.ArrayReader({}, [
                    
{name: 'company'},
                    
{name: 'price', type: 'float'},
                    
{name: 'change', type: 'float'},
                    
{name: 'pctChange', type: 'float'},
                    
{name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'}
                ])
            }
);
            ds.load();

            
var colModel = new Ext.grid.ColumnModel([
            
{id: "company", header: "Company", width: 120, sortable: true, dataIndex: 'company'},
            
{header: "Price", width: 90, sortable: true, dataIndex: 'price'},
            
{header: "Change", width: 90, sortable: true, dataIndex: 'change'},
            
{header: "% Change", width: 90, sortable: true, dataIndex: 'pctChange'},
            
{header: "Last Updated", width: 120, sortable: true
            renderer: Ext.util.Format.dateRenderer(
'm/d/Y'), dataIndex: 'lastChange'}

            ]);

            
var grid = new Ext.grid.GridPanel({
                el:
'grid-example',
                ds: ds, 
                cm: colModel,
                autoExpandColumn: 
'company',
                height:
350,
                width:
600,
                title:
'Array Grid'
            }
);
            grid.render();
            grid.getSelectionModel().selectFirstRow();
            }
);
        
</script>

在BOBY區域加入:

<div id="grid-example"></div>

這看上去很複雜,但實際上加起來,只有七行代碼。第一行創建數組並作爲數據源。實際案例中,你很可能從數據庫、或者WebService那裏得到動態的數據。接着,我們創建並加載data store, data store將會告訴Ext的底層庫接手處理和格式化這些數據。接着,我們定義一個column模型,用來輕鬆地調配Gird的每一列參數。最後我們生成這個Gird,傳入data store和column模型兩個對象,進行渲染並選好第一行。不是太困難吧

當然,你可能對這段代碼的某些細節,並不完全掌握其中的含義(像MemoryProxy究竟是什麼?)但先不要緊,這個例子的目的是告訴你,用少量的代碼,創建一個富界面的多功能的UI組件而已——這是完全可能的,更多細節的內容,留給讀者你自己學習吧。這兒有許多學習Grid的資源。Ext Grid教程交叉Gird演示Gird API文檔

還有更多的..

這只是冰山一角。還有一打的UI Widgets可以供調用,如 layouts, tabs, menus, toolbars, dialogs, tree view等等。請參閱API文檔中範例演示

使用Ajax

在弄好一些頁面後,你已經懂得在頁面和腳本之間的控制原理(interact)。接下來,你想知道的是,怎樣與後臺服務器(remote server)交換數據,常見的是從數據庫加載數據(load)或是保存數據(save)到數據庫中。通過JavaScript異步無刷新交換數據的這種方式,就是所謂的Ajax。Ext內建卓越的Ajax支持,例如,一個普遍的用戶操作就是,異步發送一些東西到服務器,然後,UI元素根據迴應(Response)作出更新。這是一個包含text input的表單,一個div用於顯示消息(注意,你可以在ExtStart.html中加入下列代碼,但這必須要訪問服務器):

<div id="msg" style="visibility: hidden"></div> 
Name: 
<input type="text" id="name" /><br /> 
<input type="button" id="oKButton" value="OK" />

接着,我們加入這些處理交換數據的JavaScript代碼到文件ExtStart.js中(用下面的代碼覆蓋):

Ext.onReady(function(){
 Ext.get(
'oKButton').on('click'function(){
   
var msg = Ext.get("msg");
    msg.load({
    url: [server url], 
//換成你的URL
    params: "name=" + Ext.get('name').dom.value,
    text: 
"Updating..."
   });
   msg.show();
 });
});

這種模式看起來已經比較熟悉了吧!先獲取按鈕元素,加入單擊事件的監聽。在事件處理器中(event handler),我們使用一個負責處理Ajax請求、接受響應(Response)和更新另一個元素的Ext內建類,稱作UpdateManager。UpdateManager可以直接使用,或者和我們現在的做法一樣,通過Element的load方法來訪問(本例中該元素是“msg“的div)。當使用Element.load方法,請求(request)會被加工處理後發送,等待服務器的響應(Response),來自動替換元素的innerHTML。簡單傳入服務器url地址,加上字符串參數,便可以處理這個請求(本例中,參數值來自“name”元素的value),而text值就是請求發送時提示的文本,完畢後顯示那個msg的div(因爲開始時默認隱藏)。當然,和大多數Ext組件一樣,UpdateManager有許多的參數可選,不同的Ajax請求有不同的方案。而這裏僅演示最簡單的那種。

PHP
<? if(isset($_GET['name'])) {   echo 'From Server: '.$_GET['name']; }?>

ASP.NET

 

protected void Page_Load(object sender, EventArgs e)
{
     
if (Request["name"!= null
    {   
        Response.Write(
"From Server: " + Request["name"]);  
        Response.End(); 
    }
}

 

Cold Fusion

<cfif StructKeyExists(url, "name")> <cfoutput>From Server: #url.name#</cfoutput></cfif>

最後一個關於Ajax的謎題就是,服務器實際處理請求和返回(Resposne)的具體過程。這個過程會是一個服務端頁面,一個Servlet,一個Http處理器,一個WebService,甚至是Perl或CGI腳本,即任何一個服務器都可以處理http請求。無法預料的是,服務器返回什麼是服務器的事情,無法給一個標準的例子來覆蓋所有的可能性。(這段代碼輸出剛纔我們傳入'name'的那個值到客戶端,即發送什麼,返回什麼)。

使用Ajax的真正挑戰,是需經過適當處理過的手工代碼,並相應格式化爲服務端可用接受的數據結構。有幾種格式供人們選擇(最常用爲JSON/XML)。正因Ext是一種與服務器中立的語言,使得其它特定語言的庫亦可用於Ext處理Ajax服務。只要頁面接受到結果是合適的數據格式,Ext絕不會過問服務器的事情!要全面討論這個問題,已超出本文的範圍。推薦正在使用Ajax的您,深入閱讀Ext Ajax教程

發佈了41 篇原創文章 · 獲贊 9 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章