2011-06-02 88 views
6

取而代之的是基於用戶操作觸發事件,你可以只聽一個對象的變化,然後做出反應?有沒有辦法監視對象的更改?

+3

http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all-browsers – 2011-06-02 15:20:15

回答

7

那麼,根據您使用的域,您可以使用backbone.js - 它有一個「模型」對象,您可以擴展並連接到模型更改後自動由事件觸發的回調 - 是,您在模型上設置了一個字段,它會自動觸發您可以收聽的事件。你必須定義你的模型來擴展它的模型,並調用setter函數,而不是直接設置屬性,但它是非常有用的,我推薦它。

只是爲了清楚起見,事件從更改爲,因此即使您以編程方式或在控制檯中設置屬性值,也會觸發該事件。

+0

謝謝馬特,骨幹看起來像一個很好的選擇。 – fancy 2011-06-02 15:26:07

+0

另一種方法是[spine.js](http://maccman.github.com/spine/) – Raynos 2011-06-02 17:48:50

0

您可以使用getter和setter ro對屬性更改作出反應。約翰雷西格寫了很棒的article關於他們。

5

我寫過這樣的東西。

https://github.com/jmoyers/mettle

person.on('name.change', function(val){ 
    // 'a new name was committed: Yolanda' 
    console.log('a new name was committed: ', val) 
}); 

person.name = 'Yolanda'; 

https://github.com/jmoyers/mettle/blob/master/src/model.coffee

這可能是一個有點多,通過所有的源挖。這裏有一個解釋:

我的項目的關鍵是兩個概念。一種是保持軌道一組屬性併爲每個使用defineGetterdefineSetter創建getter和settes。第二種方法是根據您的setter中的這些屬性更改對EventEmitter進行「子類化」並廣播事件。

音軌顯示了我如何爲一組鍵設置getter/setter。

Model.prototype.track = function(keys) { 
    _.each(keys, __bind(function(key) { 
     this.tracked.push(key); 
     this.__defineGetter__(key, __bind(function() { 
     return this.get(key); 
     }, this)); 
     return this.__defineSetter__(key, __bind(function(val) { 
     return this.set(key, val); 
     }, this)); 
    }, this)); 
    return this; 
    }; 

下面是基於「神奇」二傳手如何播放一個例子:

Model.prototype.set = function(key, val) { 
    this.attribs[key] = val; 
    this.emit('change', this.attribs); 
    type = key + '.change'; 
    this.emit(type, val); 
    }; 

這是一個簡單的例子,因爲我介紹「屬性中間件」混進去,但是這顯示瞭如何您可以基於屬性更改發出更改事件。

相關問題