假设我有一个人的模板(people.hbs),我想列出从GET检索到http://backendserver/api/people的所有人。 但是将来我决定实施一些东西,要求我根据http://backendserver/api/vehicle_people得到的数据对这些人进行排序。在此数据中,只有人员ID和车辆ID,因此我不能将人员及其相关车辆信息连接在一起,我还从http://backendserver/api/vehicles获取车辆数据。
关于如何在Ember2中实现这一点的一些困惑是
我应该将所有这些信息都放在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:
})
}
如果我不想创建任何特定路线或模板,我应该如何加载http://backendserver/api/vehicle_people的数据?在ember2中,它确实类似于基于您前往的路线的自动加载,例如,如果您在/adapters/application.js中定义了
export default DS.RESTAdapter.extend({
namespace: 'api',
host:'http://backendserver/'
});
答案 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端点中包含关联模型。
在路线上包含与您希望使用该数据的模板相匹配的模型,无论路线是什么。