我正在尝试将cookie包装在计算的可观察对象中(稍后我会将其转换为protectedObservable),但我在使用计算的可观察对象时遇到了一些问题。我的观点是,对计算的可观察对象的更改将广播到已绑定到它的任何UI元素。
我已经创建了the following fiddle
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>?
我没有使用可观察对象来存储privateZipcode
,因为它实际上只会存储在cookie中。我希望ko.computed
能提供我需要的通知和绑定功能,尽管大多数带有ko.computed
的examples I've seen最终都在幕后使用了ko.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
我怀疑我可能不得不在knockout中使用一些东西来手动通知我的ko.computed
已经更新,我对此没有意见,这是有意义的。我只是找不到一种方法来实现这一点。
发布于 2012-03-22 08:17:03
叹息,我找到一个有my exact same problem的人
如果dependentObservables在写入时不执行notifySubscribers,为什么还要费心在读取时执行呢?它们被添加到可观察对象列表中并被订阅,但之后它们永远不会在更新时触发。那么订阅它们到底有什么意义呢?
我认为,对于您的场景,dependentObservables可能不是适合这项工作的工具。dependentObservables被设置为检测read函数中的依赖关系,并在这些依赖关系中的任何一个发生变化时重新评估/通知。在可写的dependentObservable中,写函数实际上只是拦截写操作的地方,并允许您设置任何必要的观察值,以便读函数将返回正确的值(在大多数情况下,写函数通常与读函数相反,除非您正在转换值)。
对于您的情况,我个人会使用一个可观察对象来表示值,然后手动订阅该可观察对象来更新原始值(您可能无法控制的值)。
它将类似于:http://jsfiddle.net/rniemeyer/Nn5TH/
所以看起来this fiddle将是一个解决方案
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请求中对其进行编辑,等等。
发布于 2012-03-22 07:42:43
试着让你的内部privatezipcode成为一个可观察的。查看此处:http://jsfiddle.net/KodeKreachor/fAGes/9/
https://stackoverflow.com/questions/9814320
复制相似问题