2017-04-11 246 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