Knockout.js 在敲除中动态创建观察值和计算值

Knockout.js 在敲除中动态创建观察值和计算值,knockout.js,Knockout.js,我有一个可观察数组,其中包含对象(动态创建的),这些对象本身具有可观察属性。到目前为止,上帝,但当我尝试向动态创建的对象添加一个计算的可观测值时,对象的可观测值解析为未定义 //对象,其模型具有可观察数组和动态生成对象的实例 function SecretSanta(params) { ... ko.applyBindings(new this.Model(this)); }; SecretSanta.prototype = { ... Model: func

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

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

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设置为内部函数,它工作正常(但绑定不会得到更新)

有人能指出我做错了什么吗?。先谢谢你


我提供了一个完整代码的链接

当您创建计算的观测值时,会立即对其进行评估。创建时,
self.name()
的值未定义。因此,您无法调用undefined的
match

一个选项是初始化您的姓名,如下所示:

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