2016-01-22 138 views
1

我對這個問題很生氣: 我有一個模板組件,它使用{{#each}}循環來迭代一個註釋數組;Ember更新陣列不更新模板

comments: Ember.computed('commentsModel', function() { 
    return this.get('commentsModel').toArray(); 
}), 

actions: { 
    addOne: function() { 
     this.set('comments', [{content: 'agent k'}]); 
    } 
} 

的組件被稱爲像這樣:

{{photo-comments commentsModel=model.comments}} 

凡model.comments由路由的模型鉤返回; 當我點擊觸發「addOne」事件的按鈕時,模板正確更新,所有評論被刪除,只顯示新評論「agent k」;

但如果我想添加註釋到評論數組,而不是覆蓋整個數組,它不起作用; 我得到沒有錯誤,但模板只是忽略它,並沒有更新!

我試圖用推:

actions: { 
    addOne: function() { 
     this.set('comments', this.get('comments').push({content: 'agent k'}); 
    } 
} 

與pushObject:

actions: { 
    addOne: function() { 
     this.set('comments', this.get('comments').pushObject({content: 'agent k'}); 
    } 
} 

什麼!既然這讓我發瘋,有人能告訴我這有什麼問題嗎?

模板:

{{log comments}} 
{{#each comments as |comment|}} 
    <div class="card"> 
     <div class="card-content"> 
      {{comment.username}}<br> 
      {{comment.content}} 
     </div> 
     <div class="card-action"> 
      {{comment.createdAt}} 
     </div> 
    </div> 
{{/each}} 

回答

3

我認爲這裏的根本問題是,你濫用Ember.computedhelper

你的組件應該定義默認值的comments屬性,如果有一個:

comments: null, 

actions: { 
    addOne: function() { 
     this.get('comments').pushObject({content: 'agent k'}); 
    } 
} 

你的模板應通過將模型值調用組件:

{{photo-comments comments=model.comments}} 

假設,當然,model.comments可用,因爲它是通過路由的模型鉤子檢索的。

在您的示例代碼中,您將嘗試將新對象推送到包裝模型的數組表示的計算屬性,而不是將新值推送給模型本身。

+0

這是我已經嘗試過的解決方案,出現錯誤「internalModel.getRecord不是函數」;有人向我解釋說,這是由於我的模型是查詢的結果,所以不可寫;這就是爲什麼我要將註釋轉換爲數組 –

+0

啊,我想我誤解了那裏的用例。如果您要將數據推送到'RecordArray',我會在組件外執行轉換,並將數組傳遞到組件。 – solocommand

+0

好的,如果你能提供一個可行的例子,那將是非常棒的,因爲我花了幾天的時間嘗試我所知道的一切,但卻無法使它工作。問題是:我得到了一些記錄(這是不可寫的),所以我必須將它們轉換爲可寫數組,並將該數組中的對象推入,導致模板更新... –