无法获取Knockout.js来更新可观察对象属性

时间:2015-05-24 00:23:35

标签: javascript 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()不会改变observable的值。 即如果我在HTML页面中有类似的东西:     < div data-binding="text: obs_obj().test"></div>即使在调用myobj.changeTest()而不是更新后,它也会显示“foo”。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

ko.observable无法知道您何时修改myobj - 您必须&#34;告诉&#34;它。通常,这是通过在修改属性时直接使用observable来完成的。这实际上只对值(例如self.test)有意义,但您尝试将整个对象作为可观察对象。

相反,如果你真的关心分离,可以在ViewModel或单独的对象上将你关心的值分解为他们自己的observable:

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(),因为这只会返回值 - 您想要绑定到 observable本身):

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