Ember.js 在数组上使用set()

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

我有一个数组,可以缓存当天的所有活动。因此,如果我已经从服务器中提取了7月1日的活动,它将在
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属性。查看更新后的答案。在这把小提琴里,我看到了一个极简主义的样品