Dojo 1.5 提出了一種“有狀態物件”的概念. 這種有狀態物件會遵循一個原則:通過 get()
和 set()
去訪問和修改對象的屬性. 所以,擷取一個widget對象的屬性,我們用:
widget.get ( "checked" ) ;
設定一個對象的屬性,我們用:
widget.set ( "checked" , true ) ;get()和set()方法取代了原先的attr()方法,變得更加靈活易用。但是在dojo1.5中,為了向前相容,attr()方法繼續保留,但是其實現已經改變,attr()方法會直接調用widget對象的get()或者set()方法,所以我們強烈建議大家使用get()和set()方法。
dojo.Stateful 簡介
Dojo同樣提供了一種建立 有狀態物件 的介面,他要用到dojo.Stateful模組,此模組提供了get()和set()介面,同時實現了一個watch()方法,此方法提供了一種監聽對象狀態變化的機制,基於dojo.Stateful,我們建立的對象已經不僅可以被我們自己讀和寫,而且可以被我們監聽了。
1. 首先我們可以基於dojo.Stateful建立一個對象,設定price為9.99:
var obj = new dojo.Stateful ( {<br /> price: 9.99<br />} ) ;
2. 然後,我們可以通過
watch()
方法監聽該對象屬性(price)的變化:
obj.watch ( "price" , function ( ) {<br /> console.log ( "price changed to " + this .get ( "price" ) ) ;<br />} ) ;
3. 一旦該屬性改變如下:
obj.set ( "price" , 6.99 ) ;
則上述第2步中的監聽函數會被觸發,打出當前的price值。同樣,我們也可以取消監聽函數:watchHandle = obj.watch ( "price" , callback) ;
…
// 取消監聽
watchHandle.unwatch ( ) ;
Dojo.Stateful 發展趨勢
Dojo1.5現在基本只提供了get()和set()方法,我們希望在dojo1.6中讓dojo._Widget繼承自dojo.Stateful,這樣對於dijit中的所有widget我們都能監聽器狀態的變化,就像我們監聽基本對象的屬性變化一樣。
我們同樣也想將這種有狀態的功能應用到Dojo Data中,甚至更大的範圍,這樣不論是dojo的 data store, widget, 又或是任何繼承了Stateful的對象都能被監聽。
其實,實現有狀態物件最根本的動機是實現“資料的綁定”功能,比如說:我們需要一個對象的屬性的值始終與另一個對象的某個屬性的值保持一致,又或是當我們修改某個對象屬性的同時,介面上會根據此對象屬性的變化作出相應的變化,實現重新繪製(render)的效果; 這些需求我們都能通過有狀態的對象來實現,我們所要做的就是對這些對象的屬性實現一個“watch()”方法,並在方法中做出相應的實現即可。
現在,你已經可以用dojo.Stateful建立一個有狀態的widget對象,並監聽他屬性的一舉一動了。