日レベルですべてのアクティビティをキャッシュする EmberArray があります。したがって、サーバーから 7 月 1 日のアクティビティを取得した場合、activitiesByDay['2013-07-01']
. 私の問題は、これらの配列項目を get() および set() して、Ember の実行ループとデータ バインディング プロパティを利用できるようにする方法です。
完全なコードは次のとおりです。
module.exports = App.ActivitiesRoute = App.AuthenticatedRoute.extend({
onDate: null,
actionList: Ember.ArrayController.create(),
activitiesByDate: Ember.Array,
activitiesOnDate: function() {
return this.get('activitiesByDate')[this.get('onDate')].content;
}.property('activitiesByDate','onDate'),
if (!this.get('activitiesByDate')[params.on_date]) {
this.set('activities', this.store.find('activity', {on_date: params.on_date}));
this.get('activitiesByDate')[params.on_date] =
this.store.filter('activity',function(activity){
var itemDate = new Date(activity.get('start_time'));
itemDate = moment(itemDate).format('YYYY-MM-DD');
return itemDate === params.on_date;
});
}
ご覧のとおり、...
this.get('activitiesByDate')[params.on_date] =
Emberに知らせずに変更を加えているため、問題があります。set()
問題は、キーが「YYYY-MM-DD」形式の日付である配列でEmber を使用する方法が見つからないことです。このキー構造では、Javascript のブラケット表記ではなく、Ember が処理すべきドット表記を使用する必要があると思います。
- - アップデート - -
が Ember.Array ではなくオブジェクトActivitiesRoute
になるように少し更新しました。activitiesByDate
また、すべてのセッター/ゲッターをこのオブジェクトのプロパティに変更して、Embers get/set()` を使用するようにしました
App.ActivitiesRoute = App.AuthenticatedRoute.extend({
onDate: null,
activitiesByDate: Ember.Object.create(),
activitiesOnDate: function() {
return this.get('activitiesByDate.' + this.get('onDate'));
}.property('activitiesByDate'),
model: function(params) {
this.set('onDate', params.on_date);
// check if the given date has activities already loaded and if not then load it
// if it does then do NOT reload. In the case of wanting a refresh use the refreshDate() method
if (!this.get('activitiesByDate')[params.on_date]) {
console.log('getting activities for: ' + params.on_date);
this.set('activities', this.store.find('activity', {on_date: params.on_date})); // go get the dates from Server
this.set('activitiesByDate.' + [params.on_date], this.store.filter('activity',function(activity){
var itemDate = new Date(activity.get('start_time'));
itemDate = moment(itemDate).format('YYYY-MM-DD');
return itemDate === params.on_date;
}));
}
return true;
},
setupController: function(controller, model) {
controller.set('activitiesByDate',this.get('activitiesByDate'));
}
activitiesByDate
オブジェクトは正常に動作しているようです。以下は、3 つの別々の日付に移動した後の状態の例です。
これらのオブジェクトの内部を見ると、適切な量のアクティビティが含まれているため、その部分が見栄えがすることがわかります。残念ながら、計算されたプロパティ --activitiesOnDate
は、ブラウザーでリロードを押したとき以外は更新されていません。