を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
が aに設定され、返されたすべてのチャット メッセージが 1 つのブロックDS.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
。