Emberjs-1.0.0-rc.6使用可枚举列出特定日期发生的事件

时间:2013-07-22 18:18:53

标签: ember.js handlebars.js ember-router

当我定义控制器操作以显示特定日期发生的日期时,它可以正常工作,但是如果我将该控制器操作转换为属性,它将停止显示特定事件上发生的日期。 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]

jsfiddle

1 个答案:

答案 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')