国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

Atlas編程揭密之數據綁定

2024-07-21 02:29:19
字體:
來源:轉載
供稿:網友

最大的網站源碼資源下載站,

  atlas架構提供了一種比asp.net中數據綁定(data binding)強大得多的客戶端綁定模型。這種模型異常靈活,甚至有些類似wpf(windows presentation foundation)中的綁定模型。atlas提供的綁定模型允許您將某對象的任意一個屬性綁定到另外一個對象的任意一個屬性上。它不單單可以應用于數據綁定,甚至可以將某個控件的樣式綁定到另外一個控件上。這樣使得在atlas中將一切關聯起來變成可能。

  在本文中,我將嘗試分析一些atlas實現代碼來解釋atlas是如何完成binding的。

  首先讓我們察看一小段應用atlas binding的代碼。這里將一個textbox的text屬性和一個select list的selectedvalue屬性綁定起來。無論你改變其中的哪個,在另一個上面都會有立刻得到體現。

  html和aspx,定義textbox和select list。(注意必須聲明一個scriptmanager服務器端對象,以引入atlas必須的javascript文件。)

<atlas:scriptmanagerid="scriptmanager1"runat="server"/>
<div>
inputanintegerfrom1to5.<br/>
<inputid="mytextbox"type="text"/><br/>
selectanitem.<br/>
<selectid="myselect">
<optionvalue="1">value1</option>
<optionvalue="2">value2</option>
<optionvalue="3">value3</option>
<optionvalue="4">value4</option>
<optionvalue="5">value5</option>
</select>
</div>

  atlas腳本,將上面兩個html控件“升級”成atlas控件。

<pagexmlns:script="http://schemas.microsoft.com/xml-script/2005">
<references>
</references>
<components>
<textboxid="mytextbox">
<bindings>
<bindingdatacontext="myselect"datapath="selectedvalue"property="text"direction="inout"/>
</bindings>
</textbox>
<selectid="myselect"/>
</components>
</page>

  如上所示,我們只需要書寫一小段簡單的代碼即可實現需要的綁定功能。

  atlas是如何實現這些的呢?首先,atlas需要有一種途徑來監聽綁定控件的綁定屬性的變化(除非你不需要atlas提供的自動綁定功能)。在atlas.js中定義了一個名為sys.inotifypropertychanged的接口,類似.net中提供的一樣。對象可以實現這個接口以期讓別的對象監聽到自己的屬性值的變化。atlas中所有組件的基類,sys.component,實現了這個接口。sys.component同樣提供一個方法raisepropertychanged(propertyname),這個方法應該在每個屬性的setter中被調用以發出inotifypropertychanged.propertychanged事件。

  目前為止,我們可以看一下atlas控件中textbox的具體實現。看看textbox中是如何在相應的html事件發出時同樣發出propertychanged事件的。

var_text;
var_changehandler;

this.get_text=function(){
returnthis.element.value;
}

this.set_text=function(value){
if(this.element.value!=value){
this.element.value=value;
this.raisepropertychanged('text');
}
}

this.initialize=function(){
sys.ui.textbox.callbasemethod(this,'initialize');

_text=this.element.value;

_changehandler=function.createdelegate(this,this._onchanged);
this.element.attachevent('onchange',_changehandler);

_keypresshandler=function.createdelegate(this,this._onkeypress);
this.element.attachevent('onkeypress',_keypresshandler);
}

this._onchanged=function(){
if(this.element.value!=_text){
_text=this.element.value;
this.raisepropertychanged('text');
}
}

  可以看到,當text屬性改變時,atlas發出了propertychanged事件,這就使綁定到這個屬性成為可能。

  而后atlas的綁定模型捕獲到了這個事件,再根據binding聲明查找出與其相關的目的對象以及相應的屬性,并調用這個屬性的setter來實現目的對象屬性的變化。

  如果源對象(source object)實現了inotifypropertychanged接口,并且改變的屬性就是datapath 中指定的屬性,同時direction 設定為in或者inout,atlas綁定將通過分析引入(incoming的binding來處理propertychanged事件(參考下面將要介紹的evaluatein()方法)。

  類似的,如果目的對象(target object)實現了inotifypropertychanged接口,并且改變的屬性就是property中指定的屬性,同時direction 設定為out或者inout,atlas綁定將通過分析流出(outgoing的binding來處理propertychanged事件(參考下面將要介紹的evaluateout()方法)。

  接下來讓我們察看binding實現代碼中的的公有方法和屬性來分析一下atlas綁定的核心實現。在這里沒有必要列出涉及綁定的全部代碼,如果您感興趣,可以用關鍵詞sys.bindingbase和sys.binding 在atlas.js文件中進行搜索。首先是sys.bindingbase提供的方法和屬性。

  • 屬性automatic:指定當源對象的相應屬性變化時(對于in和inout),或者目的對象的相應屬性變化時(對于out和inout),綁定是否將被自動執行。這個屬性默認會被置為true。當然如果你需要完全控制綁定的開始時機時也可以設定為false。例如,某些情況下你決定在一個ajax請求成功返回的時候才開始綁定數據源與顯示控件,以確保顯示控件真正綁定到了一些數據,這時你需要顯示的調用binding的evaluate()方法以開始綁定。
  • 屬性datacontext:指定擁有待綁定屬性的對象。如果不指定的話,atlas binding將調用包含它的父控件的datacontext屬性代替。控件可以通過返回設定的datacontext或是按照默認返回其父控件的datacontext來實現這個屬性。例如,某個listview控件可以在其創建listview item時設定它的datacontext為一個datarow對象,以實現綁定。

  • 屬性datapath:指定需要綁定的源對象的屬性。atlas binding還允許綁定一個嵌套的屬性,類似:sourceobjectproperty.nestedproperty.nestednestedproperty。源代碼中可以看出atlas能自動為你轉化并運行這些代碼。datapath屬性的默認值為空,也就是atlas會綁定這個對象本身。
  • 屬性property:指定需要綁定的目標對象的屬性。你應該總是指定這個屬性,否則這個綁定就沒有任何意義。
  • 屬性propertykey:有時候我們可能需要綁定到某個對象的嵌套屬性上。比如,如果需要綁定到style的屬性color,我們可以指定property屬性為style,并指定propertykey屬性為color。
  • 屬性transformerargument:傳遞給atlas transformer的參數,只有設定transform時才會用到。
  • 事件transform:這個事件允許在綁定時指定一個transformer。當你需要在綁定的時候對數據做以處理時,transformer將會是個很好的選擇。例如,如果你希望顯示一個布爾值為yes/no而不是默認的true/false,那么就應該使用一個自定義的transformer。atlas同時提供了一些內建的transformer,例如add,multiply以及compare等。
  • 方法evaluatein:處理引入的binding。如果direction屬性設置成為in或者inout,該方法將取得源對象的屬性的值(根據binding中設定的datacontext以及datapath屬性),并調用目標對象相應屬性的setter。這也就是atlas中實現binding的核心部分。
  •   sys.binding(也在atlas.js中)中也有一些重要的方法/屬性:

  • 屬性direction:指定希望監聽的屬性變化的方向。可以設定為inout或者inout。默認值為in。
  • 方法evaluateout:與基類中的方法evaluatein類似,但是以相反的方向執行。當然,需要將directiton屬性設定為out或者inout。 希望這些解釋能夠讓您對atlas的“神奇的”綁定有一些更深入的理解。歡迎留言探討。
  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 新化县| 敦煌市| 张家界市| 绍兴市| 山东省| 四子王旗| 英吉沙县| 集贤县| 繁昌县| 九龙县| 土默特左旗| 浙江省| 花垣县| 调兵山市| 建德市| 广西| 克什克腾旗| 巴青县| 天峻县| 荔浦县| 新河县| 通辽市| 政和县| 四会市| 威信县| 赤水市| 湟中县| 沙雅县| 余庆县| 辽阳市| 大同市| 湘潭县| 石狮市| 金平| 十堰市| 南溪县| 元阳县| 盐亭县| 咸宁市| 兴山县| 贞丰县|