我是否总是需要Ember 2中每条路线的模板?

时间:2015-10-02 18:08:56

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

假设我有一个人的模板(people.hbs),我想列出从GET检索到http://backendserver/api/people的所有人。 但是将来我决定实施一些东西,要求我根据http://backendserver/api/vehicle_people得到的数据对这些人进行排序。在此数据中,只有人员ID和车辆ID,因此我不能将人员及其相关车辆信息连接在一起,我还从http://backendserver/api/vehicles获取车辆数据。

关于如何在Ember2中实现这一点的一些困惑是

  1. 我应该将所有这些信息都放在router / people.js中 像这样的东西

    export default Ember.Route.extend({
      model(){
           return Ember.RSVP.hash({
               people_with_vehicle: //find from this.store all the people and the vehicle ,
               people_with_no_vehicle:,
               all people: 
           })
      }
    
  2. 如果我不想创建任何特定路线或模板,我应该如何加载http://backendserver/api/vehicle_people的数据?在ember2中,它确实类似于基于您前往的路线的自动加载,例如,如果您在/adapters/application.js中定义了

    export default DS.RESTAdapter.extend({
       namespace: 'api',
         host:'http://backendserver/'
     });
    

2 个答案:

答案 0 :(得分:1)

您的" vehicle_people"端点最好映射到名为VehiclePeople的Ember数据模型,该模型将是:

DS.Model.extend({
  person: DS.belongsTo('person'),
  vehicle: DS.belongsTo('vehicle')
})

还有其他方法,但让我们在模型层面绘制人们驾驶的车辆。首先,我们建立人与您的小的两个属性的人对车地图之间的关系,称为vehicle_people

vehiclePeople: DS.hasMany('vehicle_people', { async: true })

每当访问此字段时,这将根据个人ID向vehicle_people端点发送网络请求或网络请求。我们会在一分钟内看到另一种处理方法。

现在,计算属性可以为我们提供实际车辆的列表。

vehicles: Ember.computed.mapBy('vehiclePeople', 'vehicle')

hasVehicle: Ember.computed.bool('vehicles.length', 0)

创建有或没有车辆的人员名单不是模型的问题;它几乎肯定是你想要在你的控制器中做的预先计算:

Ember.Controller.extend({
  peopleWithVehicles: Ember.computed.filterBy('model', 'hasVehicle')

等等。

如果你想预先加载vehicle_people关系,那么Ember Data不会尝试一次一个地获取它们,最好的方法是在beforeModel钩子中执行此操作:< / p>

...route
beforeModel() { return this.store.find('vehicle_people'); }

这是规范化模型的正确方法吗?

拥有小型模型但不是模型只能包含从一个模型(人)到另一个模型(车辆)的映射,这可能不是组织模型和端点的正确方法。只需在vehicles中直接添加person即可。这样做的障碍是什么?

答案 1 :(得分:0)

您的路线与您的模型无关,就命名惯例而言,尽管您可能经常使用它们,并嵌套您的路线以创建您的UI。

Ember不会将您的路由名称与api端点名称进行任何魔法匹配。 Ember Data为API端点与商店中的模型匹配起了一点点魔力。

1

我认为这些人都是人,并且他们会有一个属性来定义他们是车辆人还是非车辆人。如果有意义,您还可以在单​​个API端点中包含关联模型。

  1. 在路线上包含与您希望使用该数据的模板相匹配的模型,无论路线是什么。