【问题标题】:ko.computed() does not evaluate for top level object (knockout mapping)ko.computed() 不评估顶级对象(敲除映射)
【发布时间】:2013-01-21 15:49:08
【问题描述】:

我在页面上有两个值,一个是 ko.computed 属性,另一个是 ko.observable,两者都应该获得相同的值,但以两种不同的方式(使用 ko.mapping.fromJS 加载基础数据):

        //#1
        self.count = ko.computed(function () {
            return self.pages().length;
        });

        //#2
        self.count2 = ko.observable(0);
        ko.computed(function () {
            //looks like this is not fiering
            self.count2(self.pages().length);
        });

在我的情况下,#1 效果很好,但 #2 根本无法触发。同样,如果我使用 self.page.subscribe(),我也会得到想要的结果。

这个问题还有第二部分,如果我创建了一些嵌套对象,那么情况 #1 和 #2 对嵌套对象按预期工作,但问题仍然存在于顶层/父对象上。

听到是演示这种奇怪行为的示例 - http://jsfiddle.net/rrgnK/2/

我想知道是什么导致了这个问题,是我的代码/结构还是其他什么? (我试图以这种方式解决没有特别的问题,我只是注意到这种奇怪的行为,这让我认为我可能在做一些根本错误的事情)

【问题讨论】:

    标签: javascript knockout.js knockout-mapping-plugin computed-observable


    【解决方案1】:

    您的第二个 .computed 字段没有绑定到任何东西,它永远不会被调用。

    我没有建议的修复方法,因为这根本不是您应该做的。您的第一个 Code Pattern 是获得对从其他属性派生的变量的读取访问权限的预期方式。

    【讨论】:

    • knockoutjs.com/documentation/computedObservables.html 中提到了这种对 ko.computed 的使用,然后再说一遍,它如何适用于子对象?
    • @dzjosjusuns 我没有看到任何与您的代码匹配的示例。您创建了一个只读的computed,它尝试写入.count2,但它不返回值。这应该使前者依赖于后者,但是由于您没有将前者分配给一个属性,它仍然永远不会被使用。
    • 看起来这是插件中的一个错误 - github.com/SteveSanderson/knockout.mapping/issues/131
    • 我提交了该错误的拉取请求,但您使用它的方式不是本意。 @Alnitak 之所以有效,是因为映射会覆盖普通的 ko.computed 方法并捕获创建的任何计算值,然后在返回之前评估它们……即使结果没有分配给任何东西。所有这些代码所做的就是确保在某个时候通过映射的 fromJS 评估计算的值...仅供参考,如果您在旧代码中的 setTimeout 调用后检查 count2,您会看到 #2 会更新。
    • @ChrisDaMour 对 - 我没有发现 OP 正在使用插件 - 唯一提到它的是标签中。
    猜你喜欢
    • 2013-03-03
    • 2013-10-08
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    相关资源
    最近更新 更多