我有一個viewmodel是由構造函數創建的,有一些可觀察的屬性和一堆普通的舊屬性。一旦我實例化它,如果我在實例上設置了一個值,那麼對該值的更改不會反映在計算的observable中。Knockout:構造函數中的計算Observable忽略實例變化
這裏的精華版本就是我要找的:
function ViewModel(active) {
var self = this;
self.active = active;
self.getClasses = ko.computed(function() {
return this.active ? "yup" : "nope";
}, self);
}
var vm = new ViewModel(false);
vm.active = true;
alert(vm.getClasses()); //returns "nope" :/
此計算觀察到的,如果我觸摸可觀察到的這取決於,但稱這是直接導致評估與舊值將重新評估活躍的。
ko.computed是否會創建一個忽略父級更新的新閉包?將明顯的數值與可觀察的數值混合起來是否不恰當? (這個計算結果我實際上遇到了依賴關於observables和其他屬性的問題,但我不希望其他屬性在運行時發生變化。這實際上只是我單元測試中的一個問題。)
我當然可以活躍一個可觀察的,但我想知道是否有另一種方式來做到這一點。
只有在計算的函數中可觀察屬性發生改變時,計算值纔會更改。如果沒有可觀察到的變化,那麼計算結果將不會被重新評估......所以你需要設置'self.active = ko.observable(active);'或者不要在這裏使用計算,而是使用一個常規函數:'self .getClasses = function(){ return self.active? 「yup」:「nope」; };'進一步閱讀:http://knockoutjs.com/documentation/computedObservables.html依賴關係跟蹤如何工作部分 – nemesv
同樣,我知道使活動可觀察性將導致計算可觀察更新。問題是我希望它在我調用*時更新,而不是簡單地在依賴關係發生變化時更新。 –
這不是'ko.computed'的工作原理。評估函數僅在內部調用,並且僅在依賴的可觀察值發生更改時調用。您無法告訴計算機更新其值。所以不要在這裏使用計算。 – nemesv