我的应用程序中有一个非常复杂的页面,显示了许多不同的模型。我通过/updates
REST调用实时更新了其中几个模型。我传递一个last_request_timestamp
参数,它返回自上次调用以来创建或修改的模型。
我使用store.push(model, model_json)
将模型添加到商店。但是,在推送模型后,模板不会更新。如何确保商店中的模型与视图之间存在绑定?
答案 0 :(得分: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
,它就会自动添加到视图中的相应帖子中。
答案 1 :(得分:0)
您可能需要使用pushObject
将它们明确地推送到页面上显示的集合中。 store.push
将返回实时记录,因此您可以执行此类操作。
var book_record = store.push('book', model_json);
this.get('controllers.books.content').pushObject(book_record);
假设BooksController
是标准ArrayController
。
答案 2 :(得分:0)
不幸的是,它需要两个步骤(但步骤简单)。您需要将其添加到商店,然后保存它的记录,以通过适配器将更改传播到侦听器。
var pushedRecord = store.push(model, model_json);
pushedRecord.save();
此外,如果您有多条记录,则可以拨打pushMany
而不是逐个推送。你仍然需要保存每个。
store.pushMany(model, jsonArray).forEach function (pushedInstance) {
pushedInstance.save();
}