【问题标题】:Dynamically created observables and computed values in Knockout在 Knockout 中动态创建的 observables 和计算值
【发布时间】:2012-12-01 20:15:37
【问题描述】:

我有一个包含对象(动态创建)的可观察数组,这些对象本身具有可观察属性。到目前为止,上帝,但是当我尝试将计算的可观察对象添加到动态创建的对象时,对象的可观察对象解析为未定义。

// 模型具有可观察数组和动态生成对象实例的对象

function SecretSanta(params) {
    ... 
    ko.applyBindings(new this.Model(this));
};

SecretSanta.prototype = {
    ...
    Model: function(secretSanta) {

        var self = this;
        this.secretSanta = secretSanta;
        this.newSanta = new Santa();

        this.santas = ko.observableArray();

        this.addSanta = function() {
            self.santas.unshift(new Santa(self.newSanta.getName(), self.newSanta.getEmail()));
            self.newSanta.clear();
        }

        this.removeSanta = function(santa) {
            self.santas.splice(self.santas.indexOf(santa), 1);
        };

        this.santasCount = ko.computed(function() {
            return self.santas().length;
        });

        this.valid = ko.computed(function() {
            return self.santasCount() >= self.secretSanta.VALID_SANTAS;
        });
    }
};

// Dynamically generated objects
function Santa(name, email) {
    var self = this;

    this.name = ko.observable(name);
    this.email = ko.observable(email);

    this.valid = ko.computed(function () {      
        return self.name().match(/\w{3,}/);
    });     
}

在最后一行代码中,控制台抱怨 self.name() 未定义;如果我摆脱计算的初始化并将 this.valid 设置为内部函数,它工作正常(但绑定没有得到更新)。

谁能指出我做错了什么?提前非常感谢。

我提供了完整代码的链接http://jsfiddle.net/jeAtT/5/

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    计算后的 observable 在您创建它们时会立即进行评估。在创建时,self.name() 的值是未定义的。所以,你不能在 undefined 中调用match

    一种选择是将您的名字初始化为:

    this.name = ko.observable(name || "");
    

    【讨论】:

      猜你喜欢
      • 2014-08-28
      • 2018-09-01
      • 2012-07-03
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 2018-07-31
      相关资源
      最近更新 更多