国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
ajax eAjax一統(tǒng)天下之Dojo整合篇

隨著Ajax應(yīng)用越來越多,各種Ajax Library(Prototype),Ajax Framework(DWR),AjaxToolkit(Dojo,YUI)也日漸豐富起來,有沒有辦法將這些結(jié)合起來呢?類似Spring的做法,當(dāng)然我沒法整出一個IoC的微內(nèi)核將各種Ajax“粘合”起來,但是將這些Ajax可重用的組件加以整合應(yīng)該是沒有問題的,這樣即可以避免重復(fù)發(fā)明輪子,還可以針對各種Ajax進(jìn)行揚(yáng)長避短,形成一套比較全面的Ajax解決方案。同時也增加了開發(fā)人員選擇自己熟悉Ajax組件的靈活性。
目前我們公司已經(jīng)形成一套基于Ajax的完整的產(chǎn)品,封裝了自己的Ajax前后臺通訊機(jī)制以及提供了可重用的客戶端組件,我嘗試了一下將我們的產(chǎn)品與DojoToolkit進(jìn)行整合。下面是我的做法,整合的是Dojo ComboBox Widget,它實際上是一個Auto Completion組件,類似GoogleSuggest。
從Dojo提供的測試類test_ComboBox.html入手,加debugger進(jìn)行跟蹤調(diào)試,理清Dojo Widget的加載流程。
經(jīng)過跟蹤調(diào)試,對Dojo的Widget有了一個大致的了解:首先是加載當(dāng)前需要的JavaScript文件,然后對整個html頁面進(jìn)行解析。在頁面上使用widget有三種方式:一種就是在html元素上添加一些dojo能解析的屬性,如

代碼
  1. <select dojoType="combobox" style="width: 300px;" name="foo.bar1" autocomplete="false"  
  2.         onValueChanged="setVal1"  
  3.     >   

其中的dojoType,autocomplete,onValueChanged都是dojo能夠識別的屬性,這個有些類似typestry的做法。第二種就是使用DojoML的寫法:
代碼
  1. <dojo:combobox style="width: 300px;" name="foo.bar1" autocomplete="false"  
  2.         onValueChanged="setVal1"  
  3.     />   

這種寫法有些變態(tài),跟jsp中的自定義標(biāo)簽基本就是一回事,只是把解析的過程從后臺移到了前臺來做,后來看到有些框架也這么干,也就沒話說了。
還有一種寫法是使用javascript在頁面加載完成之后,在指定的html元素創(chuàng)建widget:
代碼
  1. var combo;   
  2. dojo.addOnLoad(init);   
  3. function init(){   
  4. combo = dojo.widget.createWidget("dojo:ComboBox", {name:"prog",autocomplete:false,dataUrl:"comboBoxData.js"}, dojo.byId("progCombo"));   
  5.     }   

在對元素解析創(chuàng)建的時候同時利用dojo定義的combobox html模版以及css模版完成在頁面中插入最終的combobox控件的目的。
接下來看看Dojo ComboBox如何通過ajax與后臺通訊,DojoComboBox提供了兩種自動完成方式:一種是將所有的數(shù)據(jù)下載到前臺緩存,然后在前臺根據(jù)用戶輸入的數(shù)據(jù)從緩存中匹配出自動完成所需要的數(shù)據(jù)列表。另外一種就是根據(jù)用戶每次輸入的數(shù)據(jù)實時向后臺發(fā)送請求獲得要自動完成的數(shù)據(jù),當(dāng)然這個數(shù)據(jù)也會以用戶輸入的內(nèi)容為key,以得到的數(shù)據(jù)為value進(jìn)行緩存。對于兩種方式,Dojo通過不同的DataProvider來實現(xiàn)(dojo.widget.incrementalComboBoxDataProvider和dojo.widget.basicComboBoxDataProvider),這一點(diǎn)非常精妙,讓我非常佩服。而這兩個類都是通過dojo.declare(“className”,“parentClassName”, constructor, declarationBody)這種方式來做的,這個也和我們以往的做法有別??傊褪潜容^精妙啦!
Dojo向后臺發(fā)送請求的過程封裝在dojo.io.bind()這個方法中,而我們有自己的一套前后臺通訊機(jī)制,因為必須想辦法將dojo.io.bind()替換成我們的做法來達(dá)到最終整合的目的,因為DojoComboBox的數(shù)據(jù)交互都是封裝在DataProvider里面的,因為我們只需要實現(xiàn)自己的DataProvider就可以搞定了,這樣我們無須修改Dojo的源代碼,而且還可以使用Dojo的繼承機(jī)制,從已有的DataProvider集成復(fù)寫掉我需要替換的方法,這讓我有了寫Java的感覺。
代碼
  1. dojo.declare(   
  2.     "dojo.widget.incrementalDoradoComboBoxDataProvider",   
  3.     dojo.widget.incrementalComboBoxDataProvider,   
  4.     null,   
  5.     {   
  6.         //要替換的方法,使用自己的通訊機(jī)制   
  7.         startSearch: function(/*String*/ searchStr, /*Function*/ callback){   
  8.        
  9.             if(this._inFlight){   
  10.                 // FIXME: implement backoff!   
  11.             }   
  12.                
  13.             var cmd = getControl(this.searchUrl);   
  14.             cmd.parameters().setValue("searchString", searchStr);   
  15.             var _this = this;   
  16.             EventManager.addDoradoEvent(cmd, "onSuccess", function(command){   
  17.                     _this._inFlight = false;   
  18.                     //convention:   
  19.                     //1.the key must be "result"   
  20.                     //2.the data format must be [["Alabama","AL"],["Alaska","AK"]] or [{"Alabama":"AL"},{"Alaska":"AK"}]   
  21.                     var data = dj_eval(command.outParameters().getValue("result"));   
  22.                        
  23.                     if(!dojo.lang.isArray(data)){   
  24.                         var arrData = [];   
  25.                         for(var key in data){   
  26.                             arrData.push([data[key], key]);   
  27.                         }   
  28.                         data = arrData;   
  29.                     }   
  30.                     _this._addToCache(searchStr, data);   
  31.                     callback(data);   
  32.                 }   
  33.             );   
  34.                
  35.             cmd.execute();   
  36.             this._inFlight = true;   
  37.         }   
  38.     }   
  39. );   

通過上面的處理,就可以使用我們自己的前后臺通訊機(jī)制來完成請求數(shù)據(jù)的目的。
接下來就是生成我們的頁面,添加dojo加載js代碼的腳本:
代碼
  1. <script type="text/javascript" src="./dojo/dojo.js"></script>  
  2. <script type="text/javascript">  
  3.     dojo.require("dojo.widget.ComboBox");   
  4.        
  5.     // 注意這里有一個定位的問題,查找路徑必須加"..",   
  6.     // 因為dojo在查找DoradoComboBox.js的時候會從"/dojo"而不是"/"目錄開始查找   
  7.     // 最終使用xmlhttp加載的路徑是/dojo/../adapter/dojo/widget/DoradoComboBox.js   
  8.     dojo.setModulePrefix("adapter.dojo.widget","../adapter/dojo/widget");   
  9.     dojo.require("adapter.dojo.widget.DoradoComboBox");   
  10. </script>  

下面要加載的控件部分html代碼:
代碼
  1. <input dojoType="ComboBox"    
  2.                     dataUrl="cmdComboboxSearch"    
  3.                     dataProviderClass = "dojo.widget.incrementalDoradoComboBoxDataProvider"    
  4.                     style="width: 200px;"    
  5.                     name="sample2"    
  6.                     autocomplete="false"  
  7.                     >   

這樣我們的整合工作就完成了,對了還有文件的目錄結(jié)構(gòu):
Webapp
|--adapter(存放所有用于整合的js文件)
|------dojo
|---------widget
|-----------DoradoComboBox.js
|--dojo(dojo的所有js文件)
|------src
|------dojo.js
|--js(我們自己組件庫的js文件)
|--WEB-INF
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Dojo學(xué)習(xí)筆記(2. djConfig詳解)
Dojo學(xué)習(xí)筆記(1)----什么是Dojo,如何安裝使用
Dojo Tips and Tricks - InsideRIA
JS組件系列——封裝自己的JS組件,你也可以
Dojo —— 兩種方式使用Dojox.grid.DataGrid
Dojo學(xué)習(xí)筆記
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服