当我定义控制器操作以显示特定日期发生的日期时,它可以正常工作,但是如果我将该控制器操作转换为属性,它将停止显示特定事件上发生的日期。 jsfiddle
App.EventsController = Em.ArrayController.extend({
todayEvent: function(date){
return this.get('content').filter(function(event) {
return (moment(event.get('start')).unix() == moment(date).unix());
});
}
});
我可以获取控制器的实例:
u = App.__container__.lookup("controller:events")
在事件25日,有2个事件,我可以用
获取它u.todayEvent(new Date('2013-07-25').toString())
正确返回
[> Class, > class]
但是在CalendarEvent控制器中,我想像上面一样显示特定日期的事件,但这次使用的是compute-property,所以我将 todayEvent 重新定义为计算属性,如下所示,仅此时间,它只返回true或false,而不是返回包含当天事件的类对象。
使用controllerFor在路由器序列化程序钩子中设置date属性,而不是像我们之前将todayEvent定义为控制器动作时那样传递它。
App.CalendarEventController = Em.ObjectController.extend({
date: null,
needs: ['appointments'],
todayEvent: function(){
var _self = this;
var appoint = _self.get('controllers.appointments');
var appCont = appoint.get('content');
return appCont.map(function(appointee) {
return (moment(appointee.get('event.start')).unix() == moment(_self.get('date')).unix());
});
}.property('date')
});
现在我点击预约链接,然后点击日历链接,然后点击日历中红色的其中一个日期,这样序列化程序挂钩就可以设置控制器日期,然后我进入控制台:
u = App.__container__.lookup("controller:calendarEvent")
尝试使用以下命令获取控制台中该日期发生的事件:
u.get('todayEvent')
我得到一个像 [] 这样的空数组,或者如果我使用 map()而不是 filter()进行过滤,那么返回 [false,false,false]
答案 0 :(得分:1)
您似乎需要在计算属性中添加“content。@ each”。
现在看来'todayEvent'只会在'date'更改时计算我猜测日期是在内容之前或同时设置的。
todayEvent返回[false,false],因为你使用的是map not filter。
todayEvent: function(){
var _self = this;
var appoint = _self.get('controllers.appointments');
var appCont = appoint.get('content');
return appCont.filter(function(appointee) {
return (moment(appointee.get('event.start')).unix() == moment(_self.get('date')).unix());
});
}.property('content.@each', 'date')