2013-04-25 77 views
2

這裏有一個簡單的視圖模型:淘汰賽計算bool值不更新

var vm = { 
     isValid1: ko.observable(false), 
     isValid2: ko.observable(false), 
     isValid3: ko.observable(false), 
     isValid4: ko.observable(false), 

     isAllValid: ko.computed(function() { 
      return isValid1() && isValid2() && isValid3() && isValid4(); 
     }); 
} 

當更新的isValid像這樣他們都設置爲true:

vm.isValid1(true); 
vm.isValid2(true); 
vm.isValid3(true); 
vm.isValid4(true); 

isAllValid似乎永遠不會得到更新。 我在這裏做錯了什麼?

感謝

薩科

回答

1

你不能用文字這樣,你要創建一個構造函數,並啓動它像

var VM = function() { 
     this.isValid1 = ko.observable(false); 
     this.isValid2 = ko.observable(false); 
     this.isValid3 = ko.observable(false); 
     this.isValid4 = ko.observable(false); 

     this.isAllValid = ko.computed(function() { 
      return this.isValid1() && this.isValid2() && this.isValid3() && this.isValid4(); 
     }, this); 
}; 

http://jsfiddle.net/FuuQf/

或者創建文字後設置isAllValid功能,但我不認爲文字應當使用虛擬機

+0

我會那樣做,謝謝。 – Nicolas 2013-04-25 09:50:10

4

如果您正在使用對象常量,因爲你需要定義視圖模型您computed初始宣佈後:

var vm = { 
     isValid1: ko.observable(false), 
     isValid2: ko.observable(false), 
     isValid3: ko.observable(false), 
     isValid4: ko.observable(false) 
} 

vm.isAllValid = ko.computed(function() { 
    return vm.isValid1() && vm.isValid2() && vm.isValid3() && vm.isValid4(); 
}); 

這是必要的,因爲怎樣的方式對象文字和在javascript中使用範圍工作。反正它是更好地使用構造函數爲您的視圖模型,如果您的視圖模型越來越複雜(就像cumputed性質等)

如需進一步閱讀:Difference between knockout View Models declared as object literals vs functions

+0

謝謝,很棒的鏈接。 – Nicolas 2013-04-25 09:50:36