2012-04-03 68 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

这有效地跟踪任何更改您的视图模型,以便你应该能够适应你的需求。

相关问题