2012-06-29 30 views
0

考慮下面的代碼:KnockoutJS - 有沒有簡單的方法來覆蓋單個對象的observables?

// data comes from AJAX call response (entity from db) 
var template = ko.mapping.fromJS(data); 

if (isAddMode) {        
    self.selectedCategory().EmailTemplates.push(template); 
    self.selectedTemplate(template); 
} else { 
    // why can't this work?!? 
    //vmTemplates.selectedTemplate(template);     

    // have to do this instead... 
    self.selectedTemplate().Name(template.Name()); 
    self.selectedTemplate().Subject(template.Subject()); 
    self.selectedTemplate().Content(template.Content()); 
} 

我有一個對話框,以編輯的電子郵件模板。保存模板後,將根據使用映射插件的AJAX調用的響應創建'模板'對象。

如果我正在創建一個新模板(isAddMode),那麼我可以將模板推到數組上,然後設置selectedTemplate()。這會導致編輯器字段顯示添加模板的對話框關閉後主界面上的所有最新字段。我想現在將selectedTemplate()設置爲映射的模板對象。但是這沒有效果。我能做到這一點的唯一方法就是像上面那樣設置每一個物業。爲什麼我不能像推新的可觀察值一樣去做這件事?我覺得這與新觀察者與舊觀察者脫離的事實有關。

+0

你能再現一個小提琴這種行爲?似乎爲我工作到目前爲止:http://jsfiddle.net/sU22b/ – Niko

+0

爲什麼註釋掉一個'vmTemplates'而不是'self'像其餘的? – Tyrsius

+0

vmTemplates是持有模型的變量,self是對模型中的「this」的引用,所以它應該與我使用的版本無關。 – jaffa

回答

0

你試過:

ko.mapping.fromJS(template,self.selectedTemplate); 

0

試圖把它

// data comes from AJAX call response (entity from db) 
var template = ko.mapping.fromJS(data); 

if (isAddMode) { 
    self.selectedCategory().EmailTemplates.push(template); 
    self.selectedTemplate(template); 
} else { 
    // why can't this work?!? 
    //vmTemplates.selectedTemplate(template);     

    // try it! 
    self.selectedTemplate.Push(template); 
} 
相關問題