Javascript 为什么我的ko computed observable在其值更改时不更新绑定的UI元素?

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

我试图将cookie封装在计算的可观察对象中(稍后我会将其转换为protectedObservable),但计算的可观察对象存在一些问题。我的观点是,对计算的可观察对象的更改将广播到任何绑定到它的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);?
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
。这是两种方法的唯一区别。