2013-10-28 111 views
6

我的應用程序中有一個相當複雜的頁面,顯示了很多不同的模型。我通過/updates REST呼叫實時更新其中幾個型號。我傳遞一個last_request_timestamp參數,它返回自上次調用以來創建或修改的模型。將模型推送到商店時更新視圖

我使用store.push(model, model_json)將模型添加到商店。但是,在模型推入後模板不會更新。我如何確保商店中的模型與視圖之間有約束力?

回答

5

好的,我想通了。 Ember.js FAQ表示

另一方面,過濾器執行商店緩存中所有記錄的實時搜索。只要將新記錄加載到商店中,過濾器將檢查記錄是否匹配,如果是,則將其添加到搜索結果數組中。如果該數組顯示在模板中,它將自動更新。

...

請記住,記錄不會在過濾器中顯示出來,如果店不知道他們。您可以使用商店的push()方法確保商店中有記錄。

所以在控制器中,我想要實時更新,我使用商店的filter()來獲取模型。

App.PostController = Ember.ObjectController.extend({ 
    comments: function() { 
    var postId = this.get('id'); 
    return this.get('store').filter('comment', function(comment) { 
     return comment.get('post.id') == postId; 
    }); 
    }.property('comments') 
}); 

現在,每當我push()Comment來存儲,它會自動添加到視圖中的相應崗位。

0

您可能需要將它們顯式推送到使用pushObject在頁面上表示的集合中。 store.push將返回實時記錄,所以你可以做這樣的事情。

var book_record = store.push('book', model_json); 
this.get('controllers.books.content').pushObject(book_record); 

這是假設BooksController是一個標準ArrayController

0

不幸的是,它需要兩個步驟(但簡單的步驟)。您需要將其添加到商店,然後保存該記錄以便通過適配器將更改傳播給偵聽器。

var pushedRecord = store.push(model, model_json); 
pushedRecord.save(); 

此外,如果有多個記錄,您可以撥打pushMany,而不是單獨互推的。你仍然必須保存每個。

store.pushMany(model, jsonArray).forEach function (pushedInstance) { 
    pushedInstance.save(); 
} 
+0

你不需要調用save()。只需添加就足夠了。 – kumkanillam