0

当我定义一个控制器动作来显示特定日期发生的日期时,它可以正常工作,但是如果我将该控制器动作转换为一个属性,它将停止显示特定事件发生的日期。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 控制器中,我想像上面一样显示特定日期的事件,但这次使用计算属性,所以我将todayEvent重新定义为计算属性,如下所示,只是这一次,它只返回 true 或 false 而不是返回类对象包含当天的事件。

date 属性是在路由器序列化程序挂钩中使用 controllerFor 设置的,而不是像我们之前将 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]

jsfiddle _

4

1 回答 1

1

看起来您需要将 'content.@each' 添加到您的计算属性中。

就目前而言,“todayEvent”只会在“日期”更改时计算,我猜日期是在内容之前或同时设置的。

todayEvent 返回 [false, false] 因为您使用的是地图而不是过滤器。

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')
于 2013-07-22T21:04:14.527 回答