我有一个公共财产的对象:
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”。
我做错了什么?
答案 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>