我有一个包含对象(动态创建)的可观察数组,这些对象本身具有可观察的属性。到目前为止,所以上帝,但是当我尝试将一个计算的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/
的链接答案 0 :(得分:3)
在创建计算的observable时会立即对其进行评估。在创建时,self.name()
的值未定义。因此,您无法从未定义的地方调用match
。
一种选择是初始化你的名字,如:
this.name = ko.observable(name || "");