2017-04-11 289 views
0

我正在使用KnockoutJS 3.4。观察可观察范围内的所有属性更改

我的视图模型(打字稿)看起来是这样的:

export class ItemsViewModel { 
    public currentItem: KnockoutObservable<ItemViewModel>; 
    public items: KnockoutObservableArray<KnockoutObservable<ItemViewModel>>; 
    /* snip */ 
} 

ItemViewModel,包含了一些可观察的属性。这些包括Id,NameDescription

我希望能够订阅在currentItem内发生的更改。使用currentItem.subscribe手表更改currentItem可观察值,而不是当前项目内的属性。我已经看到了另一个被认为是重复的问题,但是它只是跟踪整个对象的变化 - 我想知道某个特定属性何时在该对象上发生变化。

我该如何以最有效的方式做到这一点?

编辑我读过评论和链接的问题。它不识别更改的属性。我已经更新了这个问题来反映这一点。

+0

如果有效你,然后你可以创建的开发时间方面的意思一个在您的视图模型上调用ko.toJS的计算属性。这将为视图模型中的每个observable创建一个依赖项,然后您可以订阅该属性。 –

+0

只是为了完整起见,使用'ko.toJS',您还可以跟踪您的视图模型的某些部分的更改。 – deblocker

+0

[Knockout订阅可观察的复杂对象中的任何更改]的可能重复(http://stackoverflow.com/questions/27018684/knockout-subscribe-to-any-change-in-observable-complex-object) –

回答

2

为了确定哪个属性被修改了,您将需要一个不太通用的解决方案。您可以通过将扩展器附加到需要跟踪的每个属性来执行此操作。我希望扩展器接受可通知的视图模型级别以及扩展的属性名称。 (可悲的是JavaScript没有反射,使这部分代码能)

ko.extenders.trackChange = function (target, options) { 
    target.subscribe(function (newValue) { 
     if (ko.isSubscribable(options.notifier)) options.notifier.notifySubscribers(options.propertyName); 
    }); 
    return target; 
}; 

然后在您的视图模型中添加可订阅和订阅。

self.propertyChanged = new ko.subscribable(); 
self.propertyChanged.subscribe(function(propertyName){ 
    console.log(propertyName + " was updated"); 
}); 

最后将扩展器添加到您的属性中。

self.property1 = ko.observable(0).extend({trackChange: { propertyName: 'property1', notifier: self.propertyChanged }}); 
self.property2 = ko.observable(0).extend({trackChange: { propertyName: 'property2', notifier: self.propertyChanged }}); 
self.property3 = ko.observable(0).extend({trackChange: { propertyName: 'property3', notifier: self.propertyChanged }}); 

如果你想它,你可以自动对视图模型的循环连接扩展器的每一个属性:

self.property1 = ko.observable(); 
self.property2 = ko.observable(); 
self.property3 = ko.observable(); 

for (key in self) { 
    if (self.hasOwnProperty(key) && ko.isObservable(self[key])) { 
     self[key].extend({trackChange: { propertyName: key, notifier: self.propertyChanged }}) 
    } 
} 
+0

太棒了,这工作,做了我想要的 - 非常感谢。 – Sam