2012-12-01 62 views
2

我有一個可觀察數組,其中包含具有可觀察屬性的對象(動態創建)。到目前爲止,如此神,但當我嘗試將一個計算的觀察值添加到動態創建的對象時,該對象的觀察值將解析爲未定義的。在Knockout中動態創建observables和計算值

//對象,其模式具有可觀察到的陣列以及動態地生成的對象

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()是未定義的實例;如果我擺脫了計算初始化並將其設置爲函數內部,它工作正常(但綁定不會更新)。

任何人都可以指出我做錯了什麼?提前致謝。

我提供了一個鏈接到完整的代碼,當你創建它們http://jsfiddle.net/jeAtT/5/

回答

3

已計算觀測立即評估。在創建時,值爲self.name()未定義。所以,你不能將undefined調用match

一種選擇是初始化你的名字,如:

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

這解決了我的問題,非常感謝! – danilupion