为了确定哪个属性被修改了,您将需要一个不太通用的解决方案。您可以通过将扩展器附加到需要跟踪的每个属性来执行此操作。我希望扩展器接受可通知的视图模型级别以及扩展的属性名称。 (可悲的是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 }})
}
}
如果有效你,然后你可以创建的开发时间方面的意思一个在您的视图模型上调用ko.toJS的计算属性。这将为视图模型中的每个observable创建一个依赖项,然后您可以订阅该属性。 –
只是为了完整起见,使用'ko.toJS',您还可以跟踪您的视图模型的某些部分的更改。 – deblocker
[Knockout订阅可观察的复杂对象中的任何更改]的可能重复(http://stackoverflow.com/questions/27018684/knockout-subscribe-to-any-change-in-observable-complex-object) –