【问题标题】:Knockout computed bool value not updating淘汰赛计算的布尔值不更新
【发布时间】:2013-04-19 03:29:05
【问题描述】:

这是一个简单的视图模型:

var vm = {
        isValid1: ko.observable(false),
        isValid2: ko.observable(false),
        isValid3: ko.observable(false),
        isValid4: ko.observable(false),

        isAllValid: ko.computed(function() {
            return isValid1() && isValid2() && isValid3() && isValid4();
        });
}

当更新 isValid 并将它们全部设置为 true 时:

vm.isValid1(true);
vm.isValid2(true);
vm.isValid3(true);
vm.isValid4(true);

isAllValid 似乎永远不会更新。 我在这里做错了什么?

谢谢

尼古拉斯

【问题讨论】:

    标签: knockout.js computed-observable


    【解决方案1】:

    如果您使用对象字面量作为视图模型,您需要在初始声明后定义 computed

    var vm = {
            isValid1: ko.observable(false),
            isValid2: ko.observable(false),
            isValid3: ko.observable(false),
            isValid4: ko.observable(false)
    }
    
    vm.isAllValid = ko.computed(function() {
       return vm.isValid1() && vm.isValid2() && vm.isValid3() && vm.isValid4();
    });
    

    这是必需的,因为对象字面量和作用域在 javascript 中的工作方式。无论如何,如果您的视图模型变得复杂(例如具有累积属性等),最好使用构造函数作为您的视图模型

    进一步阅读:Difference between knockout View Models declared as object literals vs functions

    【讨论】:

      【解决方案2】:

      你不能使用这样的文字,你必须创建一个构造函数并像这样启动它

      var VM = function() {
              this.isValid1 = ko.observable(false);
              this.isValid2 = ko.observable(false);
              this.isValid3 = ko.observable(false);
              this.isValid4 = ko.observable(false);
      
              this.isAllValid = ko.computed(function() {
                  return this.isValid1() && this.isValid2() && this.isValid3() && this.isValid4();
              }, this);
      };
      

      http://jsfiddle.net/FuuQf/

      或者在创建字面量之后设置 isAllValid 函数,但我认为字面量不应该用于虚拟机

      【讨论】:

        猜你喜欢
        • 2019-06-02
        • 1970-01-01
        • 1970-01-01
        • 2017-05-17
        • 2017-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多