Ember.js 在数组上使用set()
我有一个数组,可以缓存当天的所有活动。因此,如果我已经从服务器中提取了7月1日的活动,它将在Ember.js 在数组上使用set(),ember.js,Ember.js,我有一个数组,可以缓存当天的所有活动。因此,如果我已经从服务器中提取了7月1日的活动,它将在activitiesByDay['2013-07-01']中找到。我的问题是如何获取()和set()这些数组项,以便利用Ember的运行循环和数据绑定属性 以下是完整的代码: module.exports = App.ActivitiesRoute = App.AuthenticatedRoute.extend({ onDate: null, actionList: Ember.Array
activitiesByDay['2013-07-01']
中找到。我的问题是如何获取()和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”的日期。我相信,这个键结构要求我使用Javascript的括号符号,而不是Ember应该处理的点符号
----更新----
我已经稍微更新了
ActivitiesRoute
,以便activitiesByDate
是一个对象,而不是一个Ember.Array。我还将所有setter/getter更改为该对象的属性,以使用Embers get/set()`
activitiesByDate
对象似乎工作正常。下面是一个例子,说明了在经历了三次不同的约会后,它的状态是什么样的:
从这些对象内部看,我可以看到它们包含了适当数量的活动,因此该部分看起来不错。不幸的是,我的计算属性--activitiesOnDate
在我在浏览器中单击“重新加载”时未更新 如果使用set('someProperty.+dynamicProperty,value)
和get('someProperty.+dynamicProperty)
,您将得到您想要的。就你而言:
获取过滤结果
//Instead of
this.get('activitiesByDate')[this.get('onDate')]
// You would use
this.get('activitiesByDate.' + this.get('onDate'));
// Instead of
var filtered = 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] = filtered;
// You would use
var filtered = 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;
});
// if some key change, notify the entire property
Ember.propertyWillChange(this, 'activitiesByDate');
this.set('activitiesByDate.' + params.on_date, filtered);
Ember.propertyDidChange(this, 'activitiesByDate');
设置过滤结果
//Instead of
this.get('activitiesByDate')[this.get('onDate')]
// You would use
this.get('activitiesByDate.' + this.get('onDate'));
// Instead of
var filtered = 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] = filtered;
// You would use
var filtered = 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;
});
// if some key change, notify the entire property
Ember.propertyWillChange(this, 'activitiesByDate');
this.set('activitiesByDate.' + params.on_date, filtered);
Ember.propertyDidChange(this, 'activitiesByDate');
在arraycontroller中设置新项后,是否尝试手动调用
this.get('activitiesByDate').enumerableContentDidChange()
通知系统:Ahhh。我确实尝试过“触摸”它以发出更新信号,但不知道enumerableContentDidChange()方法。让我再试一次。我认为这可能是一个非常可行的解决办法。我真是不知所措。仍然喜欢您的建议,但当我尝试实施它时,它会抱怨activitiesByDate
没有enumerableContentDidChange()属性。但是看看调试器,我可以清楚地看到它有可枚举的混入。我觉得数组下标“2013-09-25”不能通过点表示法引用,只有[]下标,我尝试了你建议的使用该语法的方法,但没有效果。我认为你的数据结构是,一个对象,其中键是日期,值是类似于(DS.FilteredRecordArray)的数组。例如:{'2013-05-05':[{id:1,…},…]}
。对吗?activitiesByDate
是一个Ember.Array。顺便说一句,我在调试控制台上尝试了您的解决方案,它看起来确实有效,但是我仍然没有得到我在实际代码执行中预期的结果。我认为使用对象更容易,就像你说的使用array[someThing]=value
,只需使用索引。如果要使用字符串设置和获取数据,则需要使用普通js对象。请小心,因为此处的activitiesByDate:Ember.Array
您正在将activitiesByDate
设置为Ember.Array类,这不是数组的新实例…问题是您的计算属性依赖于activitiesByDate
,但当前值已更改,例如activitiesByDate.2012-05-01
。当某些内容发生更改时,您需要手动通知activitiesByDate属性。查看更新后的答案。在这把小提琴里,我看到了一个极简主义的样品