我有一个DS.Store
使用DS.RESTAdapter
和 一个ChatMessage
这样定义的对象:
App.ChatMessage = DS.Model.extend({
contents: DS.attr('string'),
roomId: DS.attr('string')
});
请注意,聊天消息存在于房间中(为简单起见未显示),因此在我的聊天消息控制器(扩展Ember.ArrayController
)中,我只想为用户当前所在的房间加载消息:
loadMessages: function(){
var room_id = App.getPath("current_room.id");
this.set("content", App.store.find(App.ChatMessage, {room_id: room_id});
}
这会将 设置content
为 aDS.AdapterPopulatedModelArray
并且我的视图会愉快地将所有返回的聊天消息显示在{{#each}}
并且我的视图会愉快地在一个块
现在要添加一条新消息,我在同一个控制器中有以下内容:
postMessage: function(contents) {
var room_id = App.getPath("current_room.id");
App.store.createRecord(App.ChatMessage, {
contents: contents,
room_id: room_id
});
App.store.commit();
}
这会启动一个 ajax 请求以将消息保存在服务器上,到目前为止一切正常,但它不会更新视图。这很有意义,因为它是过滤后的结果,如果我删除 room_id 过滤器App.store.find
那么它会按预期更新。
尝试this.pushObject(message)
使用从返回的消息记录App.store.createRecord
会引发错误。
如何手动将项目添加到结果中?据我所知,似乎没有一种方法,因为两者DS.AdapterPopulatedModelArray
都是DS.FilteredModelArray
不可变的。