【问题标题】:Emberjs-1.0.0-rc.6 unable to filter controller content to return values for a particular propertyEmberjs-1.0.0-rc.6 无法过滤控制器内容以返回特定属性的值
【发布时间】:2013-07-22 16:16:17
【问题描述】:

我有 CalendarController,它使用需求 api 访问 AppointmentController,目的是过滤 AppointmentController 内容并仅返回 event.start。但我已经尝试过 filter()forEach() 并且它总是返回所有不同的属性,而不是只返回 event.start的所有可用时间>。当我使用 ma​​p() 时,它只会在控制台中返回我想要的 event.start 值,但随后把手无法显示任何内容。

u = App.__container__.lookup("controller:appointments");

y = u.get('content');

y.map(function(appointee) { return appointee.get('event.start') });

返回:

[Thu Jul 18 2013 01:00:00 GMT+0100 (GMT Daylight Time), Thu Jul 25 2013 01:00:00 GMT+0100 (GMT Daylight Time), Thu Jul 25 2013 01:00:00 GMT+0100 (GMT Daylight Time)]

当我们使用 ma​​p() 和日历模板时,jsfidle 什么也不显示。此 jsfiddle 使用 FILTER() 和日历模板显示内容,但不仅仅是 event.start,它返回其所有内容并且不过滤任何内容。

 App.AppointmentsController = Ember.ArrayController.extend({ });

Calendarscontroller todayEvent 属性使用 filter()

 App.CalendarController = Em.ObjectController.extend({
   needs: ['appointments'],

   todayEvent: function(){
      var _self = this;
      var appoint = _self.get('controllers.appointments');

      var appCont = appoint.get('content');

      return appCont.filter(function(appointee) {
         return appointee.get('event.start');
      });
  }.property()

});

注意,我添加了 {{name}} 属性以证明 todayEvent 属性 返回的内容不是由 event.start 过滤,而是仅返回 'event .start',它正在返回所有属性。

 <script type="text/x-handlebars" data-template-name='calendar'>

    <h1> from todayEvent</h1>
     {{#each todayEvent}}
        {{name}}<br/>
         {{event.start}}<br/>
     {{/each}}

路由器

App.Router.map(function() {
  this.route('events');    
  this.resource('appointments');
  this.route('calendar', {path: '/cal'});
});

使用了ember-model:

App.Appointment = Ember.Model.extend({
  name: Ember.attr(),
  event : Ember.belongsTo('App.Event', {key: 'event_id'})

});

App.Event = Ember.Model.extend( {
  title: Ember.attr(),
  start: Ember.attr(Date),
  end: Ember.attr(Date),
  allDay: Ember.attr(Boolean),
  appointments: Ember.hasMany('App.Appointment',  {key:  'appointment_ids'})
});

【问题讨论】:

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


    【解决方案1】:

    filter 方法只返回传递函数计算结果为 true 的枚举。您可以像以前一样使用 map 方法。你的代码

    y.map(function(appointee) { return appointee.get('event.start') });
    

    按照您的预期返回一个开始日期数组。错字出现在您的日历 hbs 中。

       {{#each todayEvent}}
         {{this}}
       {{/each}}
    

    Your fiddle

    【讨论】:

    • 我在您的约会控制器中看到了一些限制。如果不访问约会路线,则永远不会设置其内容。访问没有约会控制器内容的日历路线只会导致空数组。我也不知道你的代码结构
    • 感谢您的回答。除了预加载我的约会模型之外,您是否知道另一种避免这种约束的方法。第二,我可能会问另一个问题,因为我在这里粘贴的代码是我想要做的缩短版本。这是循环内容并按日期过滤。 todayEvent: function(){var _self = this; var 任命 = _self.get('controllers.appointments'); var appCont = 任命.get('内容'); return appCont.map(function(appointee) {return (moment(appointee.get('event.start')).unix() == moment(_self.get('date')).unix());}) ;}.property('日期')
    • 如果将其作为控制器方法尝试,它将起作用,请参阅 App.EventsController 和 todayEvent 方法,但作为 App.CalendarController 中的控制器属性,如我之前的问题所示,它不会列出特定日期的事件,而只会返回 true 或 false。这是 jsfiddle:jsfiddle.net/ya6rg/3。请问你知道为什么吗?
    • 你又落入了同样的陷阱。如果要根据条件返回可枚举,可以使用 filter 方法。 MeanWhile 如果满足条件,您还可以通过返回来使用 .map 方法。查看小提琴 jsfiddle.net/ya6rg/4 ...您还应该使用 getter 访问 ember KVO 属性
    猜你喜欢
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2022-01-01
    • 2013-11-24
    • 2013-11-22
    • 1970-01-01
    • 2013-05-18
    • 2018-08-11
    相关资源
    最近更新 更多