如何在Ember中从另一个数组中过滤数组?

时间:2016-07-31 23:08:24

标签: javascript ember.js

目标: 我有两个阵列:一个计划一天的车辆,以及所有车辆中的一个。如果司机想要在星期一使用车辆,我的程序应检查周一的所有驾驶员时刻表并查看正在使用的车辆并显示可用车辆的列表,然后用户可以选择一个(选择下拉列表应该永远不会显示任何不可用的内容

我似乎无法让Ember过滤数据。它全有或全无。我无法获得过滤后的数据。你愿意看看吗?

Github存储库:[https://github.com/djbreen7/ejs-taxi-app/blob/master/app/routes/schedules/view.js][1]

路由/日程表/ view.js

  model(params) {
    return this.store.findRecord('schedule', params.schedule_id);
  },

  setupController(controller, model) {
    controller.set('schedule', model);

    var self = this;
    this.store.findAll('schedule').then(function(schedules) {
      controller.set('schedules', schedules);
      var scheduledVehicles = schedules.filter(function(day) {
        if (day.get('day_of_week') === model.get('day_of_week') && day.get('vehicle.id')) {
          return self.store.findRecord('vehicle', day.get('vehicle.id'));
        }
      });
      var vehicles = self.store.findAll('vehicle');
      controller.set('vehicles', vehicles.filter(function(vehicle) {
        return scheduledVehicles.indexOf(vehicle) === -1;
      }));
    });
  },

1 个答案:

答案 0 :(得分:0)

我认为所有这些过滤都应该在后端服务器中完成。

无论如何,在客户端这样做,你不应该在setupController中使用异步。我的意思是不要在setupController中使用ember数据查找。

model(params){
  return Ember.RSVP.hash({
    schedule: this.store.findRecord('schedule', params.schedule_id),
    allSchedules: this.store.findAll('schedule'),
    allVehicles: this.store.findAll('vehicle')
  });
}

setupController(controller, model) {
    controller.set('schedule', model.schedule); 
    controller.set('schedules', model.allSchedules); 

    var self = this;
    var scheduledVehicles = schedules.filter(function(day) {
        if (day.get('day_of_week') === model.get('day_of_week') && day.get('vehicle.id')) {
          return self.store.peekRecord('vehicle', day.get('vehicle.id'));
        }
      });
    var destVehicles = model.allVehicles.filter(function(vehicle) {
        return scheduledVehicles.indexOf(vehicle) === -1;
      }));
    controller.set('vehicles', destVehicles);
}

另外,对于这种用法,我建议使用置于控制器中的computed属性。