基本的なセットアップは次のとおりです。
- 単純な計算プロパティを使用して、ember データ モデルの配列をハンドルバー テンプレートにバインドします。
- xhr 経由でモデルを取得する前に、いくつかの構成に基づいていくつかのモデルを先頭に追加します
- xhr が解決されたら、構成モデルのいずれかを、ワイヤを介して戻ってくるオブジェクトに置き換える必要があります
- 計算されたプロパティには 2 つの項目しかないことがメモリ内で確認できるため、これは機能しているように見えますが、ハンドルバー テンプレートには 3 つが表示されているようです (xhr が返された後に配列から実際に切り取られた構成モデルの 1 つ)。
上記の # を次のように確認しました
a.)私が求めたクロム開発ツールで
App.Day.find(1).get('listings').get('length'); //xhr の後に 2 を返します
b.) また、次のことを行いました
App.Appointment.all().get('長さ'); //xhr の後に 2 を返します
**ここにコードがあります**
次のハンドルバー テンプレートがあります (2 つではなく 3 つのアイテムが表示されます)
{{#each appointment in day.listings}}
{{appointment.start}}<br />
{{/each}}
私の日モデルのリスティング計算プロパティは次のようになります
App.Day = DS.Model.extend({
name: DS.attr('string'),
appointments: function() {
return App.Appointment.find();
}.property(),
listings: function() {
//pretend we need to add some values in memory before we fire the xhr ...
App.Appointment.add({name: 'first'});
return this.get('appointments');
}.property().volatile()
});
アポイントメント モデルは ember-data モデルですが、メモリ内のアイテムをオンザフライで置き換える必要があるため、find メソッドをオーバーライドします (そして、独自の add メソッドでスタブして、配列をより適切に制御します)。
App.Appointment = DS.Model.extend({
name: DS.attr('string')
}).reopenClass({
records: [],
find: function() {
var self = this;
self.records.clear();
$.getJSON('/api/appointments/', function(response) {
for(var i = 0; i < response.length; i++) {
for(var j = 0; j < self.records.get('length'); j++) {
if (self.records[j].get('name') === response[i].name) {
//now that our xhr has finished we need to replace any that already exist
self.records.splice(j, 1);
}
}
}
});
return this.records;
},
all: function() {
return this.records;
},
add: function(record) {
this.records.addObject(App.Appointment.createRecord(record));
}
});