2

監視可能な属性を持つオブジェクト(動的に作成された)を含む監視可能な配列があります。これまでのところ神ですが、動的に作成されたオブジェクトに計算されたオブザーバブルを追加しようとすると、オブジェクトのオブザーバブルは未定義に解決されます。

//モデルに監視可能な配列と動的に生成されたオブジェクトのインスタンスがあるオブジェクト

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/

4

1 に答える 1

3

計算されたオブザーバブルは、作成するとすぐに評価されます。作成時の値self.name()は未定義です。matchしたがって、未定義を中止することはできません。

1つのオプションは、次のように名前を初期化することです。

this.name = ko.observable(name || "");
于 2012-12-01T20:45:39.050 に答える