在Knockout中动态创建observable和计算值

时间:2012-12-01 20:15:38

标签: knockout.js

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

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

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/

的链接

1 个答案:

答案 0 :(得分:3)

在创建计算的observable时会立即对其进行评估。在创建时,self.name()的值未定义。因此,您无法从未定义的地方调用match

一种选择是初始化你的名字,如:

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