Javascript 为什么我的ko computed observable在其值更改时不更新绑定的UI元素?
我试图将cookie封装在计算的可观察对象中(稍后我会将其转换为protectedObservable),但计算的可观察对象存在一些问题。我的观点是,对计算的可观察对象的更改将广播到任何绑定到它的UI元素 我创造了 JavaScript:Javascript 为什么我的ko computed observable在其值更改时不更新绑定的UI元素?,javascript,knockout.js,computed-observable,Javascript,Knockout.js,Computed Observable,我试图将cookie封装在计算的可观察对象中(稍后我会将其转换为protectedObservable),但计算的可观察对象存在一些问题。我的观点是,对计算的可观察对象的更改将广播到任何绑定到它的UI元素 我创造了 JavaScript: var viewModel = {}; // simulating a cookie store, this part isnt as important var cookie = function () { // simulating a v
var viewModel = {};
// simulating a cookie store, this part isnt as important
var cookie = function () {
// simulating a value stored in cookies
var privateZipcode = "12345";
return {
'write' : function (val) { privateZipcode = val; },
'read': function () { return privateZipcode; }
}
}();
viewModel.zipcode = ko.computed({
read: function () {
return cookie.read();
},
write: function (value) {
cookie.write(value);
},
owner: viewModel
});
ko.applyBindings(viewModel);?
zipcode:
<input type='text' data-bind="value: zipcode"> <br />
zipcode:
<span data-bind="text: zipcode"></span>?
HTML:
var viewModel = {};
// simulating a cookie store, this part isnt as important
var cookie = function () {
// simulating a value stored in cookies
var privateZipcode = "12345";
return {
'write' : function (val) { privateZipcode = val; },
'read': function () { return privateZipcode; }
}
}();
viewModel.zipcode = ko.computed({
read: function () {
return cookie.read();
},
write: function (value) {
cookie.write(value);
},
owner: viewModel
});
ko.applyBindings(viewModel);?
zipcode:
<input type='text' data-bind="value: zipcode"> <br />
zipcode:
<span data-bind="text: zipcode"></span>?
这是有意义的,正如我所期望的那样,因为viewModel.zipcode
依赖于separateobservable
,对它的更新应该(并且确实)向UI发出更新的信号我不明白的是,为什么调用我的ko.computed
上的write
函数不向UI发出更新的信号,因为该元素绑定到该ko.computed
我怀疑我可能必须在knockout中使用一些东西来手动发出信号,表明我的
ko.computed
已经更新,我对此没有意见,这是有道理的。我只是没能找到一种方法来实现这一点。试着让你的内部私有密码成为可观察的。看这里:唉,我发现有人
如果DependentToServables不在写入时通知订阅者,为什么要这样做
甚至连读都懒得做?它们被添加到可观察列表中
并且订阅了,但是他们不会在更新时触发。那是什么呢
订阅它们到底有什么意义
答复:
我认为在您的场景中,DependentToServables可能不是
适合这项工作的工具。DependentToServables设置为检测
读取函数中的依赖项,并在任何时候重新评估/通知
这些依赖关系中的大多数会发生变化。在可写的DependentToServable中
写函数实际上只是一个拦截写操作并允许写操作的地方
您需要设置任何必要的观察值,以便您的读取功能
将返回正确的值(写入通常与读取相反
在大多数情况下,除非您正在转换值)
对于你的情况,我个人会用一个可观察的来表示
值,然后手动订阅该可观察对象以更新
原始值(您可能无法控制的值)
就像:
看来这是个解决办法
var viewModel = {};
// simulating a cookie store, this part isnt as important
var cookie = function () {
// simulating a value stored in cookies
var privateZipcode = "12345";
return {
'write' : function (val) {
console.log("updated cookie value with: " + val);
privateZipcode = val;
},
'read': function () {
return privateZipcode;
}
}
}();
viewModel.zipcode = ko.observable(cookie.read());
// manually update the cookie when the observable changes
viewModel.zipcode.subscribe(function(newValue) {
cookie.write(newValue);
});
ko.applyBindings(viewModel);
这是有道理的,而且使用起来也比较简单。总的来说,我不确定将cookie视为可观察对象有多好,因为服务器可以在ajax请求中编辑它,等等。在我的示例中,它实际上是通过
$.cookie.get()
和$.cookie.set()
来编写/读取该值。除了我在我的ko.computed
observative中所做的之外,我没有能力让它成为可观察的。想法是,ko.computed
将封装对cookie的写入/读取,这就是为什么我不太喜欢使用subscribe
。对,但是如果cookie对象本身没有任何击倒依赖项跟踪系统可以跟踪的东西,那么你可能就倒霉了。如果您只是将内部privateZipcode设置为可观察的,那么您应该能够看到值的更新。因此cookie对象本身不是可观察的,它只包含一个可观察的,以便在写入时可以对其进行跟踪。本质上,您建议的是与Niemeyer相同的东西,我将为此定义+1。他更进一步(这就是我的意思),基本上是说“将它存储在一个可观察对象中并订阅它”。通过这样做,它完全不需要计算ko.computed
。这是两种方法的唯一区别。