我正在尝试将一个 cookie 包装在一个计算的 observable 中(我稍后会变成一个 protectedObservable)并且我在计算 observable 时遇到了一些问题。我认为对计算出的 observable 的更改将被广播到任何绑定到它的 UI 元素。
我创建了以下小提琴
JavaScript:
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);?
HTML:
zipcode:
<input type='text' data-bind="value: zipcode"> <br />
zipcode:
<span data-bind="text: zipcode"></span>?
我没有使用 observable 来存储privateZipcode
,因为它实际上只是在 cookie 中。我希望ko.computed
它将提供我需要的通知和绑定功能,尽管我看到的大多数示例最终ko.computed
都使用了ko.observable
底层。
将值写入我计算的 observable 的行为不应该向绑定到其值的 UI 元素发出信号吗?这些不应该更新吗?
解决方法
我有一个简单的解决方法,我只使用ko.observable
我的 cookie 存储的旁边,使用它会触发对我的 DOM 元素的所需更新,但这似乎完全没有必要,除非ko.computed
缺少具有的信号/依赖类型功能ko.observable
。
我的解决方法 fiddle,您会注意到唯一改变的是我添加了一个seperateObservable
不用作存储的,它的唯一目的是向 UI 发出底层数据已更改的信号。
// simulating a cookie store, this part isnt as important
var cookie = function () {
// simulating a value stored in cookies
var privateZipcode = "12345";
// extra observable that isnt really used as a store, just to trigger updates to the UI
var seperateObservable = ko.observable(privateZipcode);
return {
'write' : function (val) {
privateZipcode = val;
seperateObservable(val);
},
'read': function () {
seperateObservable();
return privateZipcode;
}
}
}();
这是有道理的,并且可以按我的预期工作,因为viewModel.zipcode
依赖seperateObservable
和更新应该(并且确实)向 UI 发出更新信号。 我不明白的是,为什么write
对我的函数的调用没有通知ko.computed
UI 更新,因为该元素绑定到那个ko.computed
?
我怀疑我可能必须在淘汰赛中使用某些东西来手动表示我ko.computed
的已更新,我对此很好,这是有道理的。我只是一直无法找到实现这一目标的方法。