Javascript Can';t获取Knockout.js以更新可观察对象属性

Javascript Can';t获取Knockout.js以更新可观察对象属性,javascript,knockout.js,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;

我有一个具有公共财产的对象:

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页面中有类似的内容:
即使调用了
myobj.changeTest()
而不是更新,它也会显示“foo”


我做错了什么

ko.observable
无法知道您何时修改了
myobj
——您必须“告诉”它。通常,这是通过在修改属性时直接使用observable来完成的。这实际上只对值(如
self.test
)有意义,但您正试图让整个对象成为可观察对象

相反,将您关心的值分解为它们自己的可观测值,无论是在ViewModel上还是在单独的对象上(如果您真正关心分离):

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()
,因为这只会返回值-您希望绑定到可观察对象本身):



谢谢!我假设Knockout使用了一些JS内省特性来检查可观察值是否已更改(并在ko.observable函数中附加了更改侦听器)。不过,你的答案更有意义。@monday:有趣的是,其他一些JS库选择使用这种脏检查来进行数据绑定,即AngularJS。在(罕见的)需要修改可观察对象的成员的情况下,知道这一点也很有用,您可以告诉Knockout,observable已经用myobj.valueHasMutated()进行了变异。@monday构建vm的方法尝试一下#好的。干杯
<div data-bind="text: obs_obj.test"></div>