爲了確定哪個屬性被修改了,您將需要一個不太通用的解決方案。您可以通過將擴展器附加到需要跟蹤的每個屬性來執行此操作。我希望擴展器接受可通知的視圖模型級別以及擴展的屬性名稱。 (可悲的是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) –