【发布时间】:2012-04-06 13:04:00
【问题描述】:
我正在尝试将一个 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 将提供我需要的通知和绑定功能,尽管大多数examples I've seen 和ko.computed 最终在封面下使用ko.observable。
将值写入我计算的 observable 的行为不应该向绑定到其值的 UI 元素发出信号吗?这些不应该更新吗?
解决方法
我有一个简单的解决方法,我只需在我的 cookie 存储旁边使用 ko.observable 并使用它会触发对我的 DOM 元素的所需更新,但这似乎完全没有必要,除非 ko.computed 缺少信号 / ko.observable 具有的依赖类型功能。
My workaround 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 进行更新。 我不明白, 是为什么我的ko.computed 上的write 函数调用没有通知UI 更新,因为该元素绑定到ko.computed?
我怀疑我可能不得不在淘汰赛中使用某些东西来手动表示我的ko.computed 已更新,我对此很好,这是有道理的。我只是无法找到一种方法来实现这一点。
【问题讨论】:
标签: javascript knockout.js computed-observable