szhswl
          宋針還的個(gè)人空間
          翻譯:Frank

          使用Widgets

          (Widget原意為“小器件”,現(xiàn)指頁面中UI控件)

          除了我們已經(jīng)討論過的核心JavaScript庫,現(xiàn)在的Ext亦包括了一系列的最前端的JavaScirptUI組件庫。文本以一個(gè)最常用的widget為例子,作簡(jiǎn)單的介紹。

          MessageBox

          比起略為沉悶的“HelloWolrd”消息窗口,我們做少許變化,前面我們寫的代碼是,單擊某個(gè)段落便會(huì)高亮顯示,現(xiàn)在是單擊段落,在消息窗口中顯示段落內(nèi)容出來。
          在上面的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
          });
          

          這里有些新的概念討論一下。在第一行中我們創(chuàng)建了一個(gè)局部變量(Local Variable)來保存某個(gè)元素的引用,即被單擊的那個(gè)DOM節(jié)點(diǎn)(本例中,我們總是段落paragrah,事因我們已經(jīng)定義該事件與<p>標(biāo)簽發(fā)生關(guān)聯(lián)的了)。為什么要這樣做呢?嗯...觀察上面的代碼,我們需要引用同一元素來高亮顯示,在MessageBox中也是引用同一元素作為參數(shù)使用。
          一般來說,多次重復(fù)使用同一值(Value)或?qū)ο?,是一個(gè)不好的方式,所以,作為一個(gè)好的OOP開發(fā)者,應(yīng)該是將其分配到一個(gè)局部變量中,反復(fù)使用這變量!

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

          Gird

          Gird是Ext中人們最想先睹為快的Widgets之一,也是最流行之一。好,讓我們看看怎么輕松地創(chuàng)建一個(gè)Gird并運(yùn)行。用下列代碼替換ExtStart.js中全部語句:

          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({id: 0}, [
          {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([
          {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.Grid('grid-example', {ds: ds, cm: colModel});
          grid.render();
          grid.getSelectionModel().selectFirstRow();
          });
          

          這看上去很復(fù)雜,但實(shí)際上加起來,只有七行代碼。第一行創(chuàng)建數(shù)組并作為數(shù)據(jù)源。實(shí)際案例中,你很可能從數(shù)據(jù)庫、或者WebService那里得到動(dòng)態(tài)的數(shù)據(jù)。接著,我們創(chuàng)建并加載data store, data store將會(huì)告訴Ext的底層庫接手處理和格式化這些數(shù)據(jù)。接著,我們定義一個(gè)column模型,用來輕松地調(diào)配Gird的每一列參數(shù)。最后我們生成這個(gè)Gird,傳入data store和column模型兩個(gè)對(duì)象,進(jìn)行渲染并選好第一行。不是太困難吧?

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

          還有更多的..

          這只是冰山一角。還有一打的UI Widgets可以供調(diào)用,如 layouts, tabs, menus, toolbars, dialogs, tree view等等。請(qǐng)參閱API文檔中范例演示

          使用Ajax

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

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

          接著,我們加入這些處理交換數(shù)據(jù)的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();
          });
          });

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

          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>

          最后一個(gè)關(guān)于Ajax的謎題就是,服務(wù)器實(shí)際處理請(qǐng)求和返回(Resposne)的具體過程。這個(gè)過程會(huì)是一個(gè)服務(wù)端頁面,一個(gè)Servlet,一個(gè)Http處理器,一個(gè)WebService,甚至是Perl或CGI腳本,即任何一個(gè)服務(wù)器都可以處理http請(qǐng)求。無法預(yù)料的是,服務(wù)器返回什么是服務(wù)器的事情,無法給一個(gè)標(biāo)準(zhǔn)的例子來覆蓋所有的可能性。(這段代碼輸出剛才我們傳入'name'的那個(gè)值到客戶端,即發(fā)送什么,返回什么)。

          使用Ajax的真正挑戰(zhàn),是需經(jīng)過適當(dāng)處理過的手工代碼,并相應(yīng)格式化為服務(wù)端可用接受的數(shù)據(jù)結(jié)構(gòu)。有幾種格式供人們選擇(最常用為JSON/XML)。正因Ext是一種與服務(wù)器中立的語言,使得其它特定語言的庫亦可用于Ext處理Ajax服務(wù)。只要頁面接受到結(jié)果是合適的數(shù)據(jù)格式,Ext絕不會(huì)過問服務(wù)器的事情!要全面討論這個(gè)問題,已超出本文的范圍。

          本文轉(zhuǎn)自:http://www.ajaxjs.com/yuicn/article.asp?id=20072736



          ---------------------------------------------------------------------------------------------------------------------------------
          說人之短,乃護(hù)己之短。夸己之長(zhǎng),乃忌人之長(zhǎng)。皆由存心不厚,識(shí)量太狹耳。能去此弊,可以進(jìn)德,可以遠(yuǎn)怨。
          http://www.aygfsteel.com/szhswl
          ------------------------------------------------------------------------------------------------------ ----------------- ---------
          posted on 2007-12-07 11:42 宋針還 閱讀(496) 評(píng)論(0)  編輯  收藏 所屬分類: EXT
          主站蜘蛛池模板: 邛崃市| 昌黎县| 彝良县| 灵丘县| 德江县| 白城市| 乐清市| 临湘市| 美姑县| 会宁县| 大宁县| 穆棱市| 梁山县| 江西省| 赣榆县| 屏东市| 南充市| 临泉县| 剑河县| 建昌县| 上思县| 连山| 南陵县| 息烽县| 巴林右旗| 黄平县| 同德县| 四平市| 岱山县| 麻城市| 清新县| 托里县| 新闻| 托克托县| 家居| 武邑县| 轮台县| 周至县| 淮阳县| 沾化县| 宁武县|