2012-04-03 69 views
3

我需要知道(在JS中)何時我的模型(使用knockout.js)或者更改了propery。knockout.js中的事件處理程序模型更改

我該怎麼做?

這裏是一些代碼:

function DrawingToolViewModel() { 
    var self = this; 
    self.drawMode = ko.observable('Line'); 
} 
model = new DrawingToolViewModel(); 
ko.applyBindings(model); 

現在分配的HTML元素drawMode將通過模型和背部,一切的變化進行更新。這很好,但如果模型中的某些內容發生了變化,我如何才能在JS中做出反應?

編輯

我的問題是不夠清楚,對不起。我知道observables,但我想訂閱所有的屬性,而不是爲每個屬性做。

+0

您是否需要知道屬性發生了什麼變化?你是否需要將它應用到對象深處,或者只是第一層屬性? – 2012-04-03 14:53:18

+0

該屬性並不重要,只是第一層,沒有深度。 – Marc 2012-04-03 15:35:38

回答

4

如果你想註冊自己的訂閱通知更改觀測的更像是「如果模型東西已經改變時通知我」,你可以撥打他們的訂閱功能,例如:

myViewModel.personName.subscribe(function(newValue) { 
    alert("The person's new name is " + newValue); 
}); 

更多細節@knockoutjs.com

總結如下

註釋若要在視圖模型的每一個變化通知,檢查Ryan Niemeyer文章一nd John papa的NuGet上的changeTracker

+0

我的問題不夠清楚,對不起。我知道observables,但我想訂閱所有的屬性,而不是爲每個屬性做。更像是「如果模型中的某些東西發生了變化,請通知我」。 – Marc 2012-04-03 14:35:55

+2

我會看看這個帖子,然後在你的淘汰賽中添加一個髒標誌。這可以有效地追蹤對視圖模型的任何更改,因此您應該能夠根據您的需求進行調整。 http://www.knockmeout.net/2011/05/creating-smart-dirty-flag-in-knockoutjs.html我已經更新了我的回答。 – 2012-04-03 14:54:18

+1

訂閱可能是你所需要的,如果它只是一次訂閱。否則,更改跟蹤器更符合您的需求。 Ryan的這篇文章很好。另外,我在NuGet上創建了一個可以簽出的changeTracker。我將用Ryan貢獻的更多功能來更新它...很快:) – 2012-04-03 16:04:04

0

如果您希望在特定屬性更改時收到通知,那麼您可以通過多種方式來執行您想要的操作。一種方法是使用subscribe功能:

model.drawMode.subscribe(function(newValue) {  
    // your js goes in here 
}); 

編輯

但是,如果你想通知當任何您的視圖模型屬性更改,那麼我會看看這個帖子爲創造一個「髒標記」:

http://www.knockmeout.net/2011/05/creating-smart-dirty-flag-in-knockoutjs.html

這有效地跟蹤任何更改您的視圖模型,以便你應該能夠適應你的需求。

相關問題