2015-05-24 114 views
3

我有一個公共屬性的對象:無法獲得Knockout.js更新可觀察的對象屬性

function MyClass() { 
    var self = this; 
    self.test = 'foo'; 
    self.changeTest = function() {self.test = 'bar';} 
} 

var myobj = new MyClass(); 

該屬性可以通過某些對象的方法,並從「外部」進行訪問。現在,如果我創建和綁定這樣的視圖模型:

function AppVMClass() { 
    var self = this; 
    self.obs_obj = ko.observable(myobj); 
} 
var vmodel = new AppVMClass(); 
ko.applyBindings(vmodel); 

然後調用myobj.changeTest()不會改變的可觀測值。 也就是說如果我在HTML頁面中有這樣的內容: < div data-binding="text: obs_obj().test"></div>即使在調用myobj.changeTest()而不是更新後,它也會顯示「foo」。

我在做什麼錯?

回答

3

ko.observable沒有辦法知道你什麼時候修改了myobj - 你必須「告訴」它。通常,這是通過在修改屬性時直接使用observable來完成的。這真的只對值有意義(如self.test),但你試圖讓整個對象成爲可觀察對象。

相反,打破了你關心到自己的觀測值,無論是在視圖模型或一個單獨的對象上,如果你真的關心分離:

function MyClass() { 
    var self = this; 
    // Notice that we're creating an observable directly, 
    // and setting its value in the changeTest method. 
    self.test = ko.observable('foo'); 
    self.changeTest = function() {self.test('bar');} 
} 

var myobj = new MyClass(); 

function AppVMClass() { 
    var self = this; 
    self.obs_obj = myobj; 
} 

,改變你的模板(注意,不做obs_obj.test(),因爲這將剛剛返回值 - 要綁定到觀察到自身):

<div data-bind="text: obs_obj.test"></div> 
+0

謝謝!我認爲Knockout使用了一些JS內省功能來檢查可觀察值是否已經改變(並且在ko.observable函數中附加了改變監聽器)。雖然你的答案更有意義。 – monday

+1

@monday:作爲一個有趣的說明,其他一些JS庫選擇正確地使用這種髒數據綁定檢查 - 即AngularJS。 – voithos

+2

知道在需要修改observable成員的(罕見)情況下,您可以告訴Knockout可觀察對象已經使用myobj.valueHasMutated()進行了變異,這也很有用。 –

相關問題