首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我的ko computed observable在其值发生变化时不更新绑定的UI元素?

为什么我的ko computed observable在其值发生变化时不更新绑定的UI元素?
EN

Stack Overflow用户
提问于 2012-03-22 07:26:52
回答 2查看 18.7K关注 0票数 17

我正在尝试将cookie包装在计算的可观察对象中(稍后我会将其转换为protectedObservable),但我在使用计算的可观察对象时遇到了一些问题。我的观点是,对计算的可观察对象的更改将广播到已绑定到它的任何UI元素。

我已经创建了the following fiddle

JavaScript

代码语言: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

代码语言:javascript
复制
zipcode:
<input type='text' data-bind="value: zipcode"> <br />

zipcode: 
<span data-bind="text: zipcode"></span>?

我没有使用可观察对象来存储privateZipcode,因为它实际上只会存储在cookie中。我希望ko.computed能提供我需要的通知和绑定功能,尽管大多数带有ko.computedexamples I've seen最终都在幕后使用了ko.observable

将值写入计算的可观察值的行为不应该向绑定到它的值的UI元素发出信号吗?这些不是应该更新吗?

解决方法

我有一个简单的解决方法,我只需在我的cookie存储旁边使用一个ko.observable,使用它将触发对我的DOM元素所需的更新,但这似乎完全没有必要,除非ko.computed缺乏ko.observable所具有的信号/依赖项类型功能。

My workaround fiddle,您会注意到,唯一改变的是我添加了一个不用作存储的seperateObservable,它的唯一目的是向UI发出底层数据已更改的信号。

代码语言:javascript
复制
// 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已经更新,我对此没有意见,这是有意义的。我只是找不到一种方法来实现这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-22 08:17:03

叹息,我找到一个有my exact same problem的人

如果dependentObservables在写入时不执行notifySubscribers,为什么还要费心在读取时执行呢?它们被添加到可观察对象列表中并被订阅,但之后它们永远不会在更新时触发。那么订阅它们到底有什么意义呢?

Ryan Niemeyer回答:

我认为,对于您的场景,dependentObservables可能不是适合这项工作的工具。dependentObservables被设置为检测read函数中的依赖关系,并在这些依赖关系中的任何一个发生变化时重新评估/通知。在可写的dependentObservable中,写函数实际上只是拦截写操作的地方,并允许您设置任何必要的观察值,以便读函数将返回正确的值(在大多数情况下,写函数通常与读函数相反,除非您正在转换值)。

对于您的情况,我个人会使用一个可观察对象来表示值,然后手动订阅该可观察对象来更新原始值(您可能无法控制的值)。

它将类似于:http://jsfiddle.net/rniemeyer/Nn5TH/

所以看起来this 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) { 
            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请求中对其进行编辑,等等。

票数 18
EN

Stack Overflow用户

发布于 2012-03-22 07:42:43

试着让你的内部privatezipcode成为一个可观察的。查看此处:http://jsfiddle.net/KodeKreachor/fAGes/9/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9814320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档