Ember.js Emberjs 2.0+;使用存储中的新数据更新路线模型(createRecord)
我是新加入灰烬的,所以我的方法可能是不正确的。 我正在使用最新的Ember 2.9.1 我的计划是更新管线的模型,并使所有组件呈现集合中新添加/保存的项目 (我想在调用保存后(在创建记录上),用用户角色的新记录更新路由模型(用户角色数组) 到目前为止,我有一个路线,它有一个模型,如下所示:Ember.js Emberjs 2.0+;使用存储中的新数据更新路线模型(createRecord),ember.js,ember-data,Ember.js,Ember Data,我是新加入灰烬的,所以我的方法可能是不正确的。 我正在使用最新的Ember 2.9.1 我的计划是更新管线的模型,并使所有组件呈现集合中新添加/保存的项目 (我想在调用保存后(在创建记录上),用用户角色的新记录更新路由模型(用户角色数组) 到目前为止,我有一个路线,它有一个模型,如下所示: model(){ // this is my "user.edit" route let user = this.modelFor('user'); let newUserRole = this.
model(){
// this is my "user.edit" route
let user = this.modelFor('user');
let newUserRole = this.get('store').createRecord('userRole');
newUserRole.set('user_id', user.get('id'));
return RSVP.hash({
user: user,
userRoles: store.query('userRole', { user_id: user.get('id') }),
roles: store.findAll('role'),
newUserRole: newUserRole
});
}
newUserRole.set('user_id', user.get('id'));
然后我有一个控制器和两个修改newUserRole的组件。
在路由中,我有一个保存新用户角色的操作:
actions: {
saveNewUserRole: function () {
let currentModel = this.modelFor('user.edit');
currentModel.newUserRole.save().then(function (newUserRole) {
currentModel.userRoles.addObject(newUserRole);
});
}
}
有趣的是,一个新项目(newUserRole)被添加到集合中,但在模型的控制台日志中告诉我,新对象与集合中的其他对象有点不同。
通过查看ember的类似问题,我发现人们使用:
\u内部模型或toArray():和或用于存储/更新数据的服务(?)
(也从使用pushObject更改为addObject(v1.3+);加上监听用户角色的观察者不会在组件内部触发更改,或者如果我调用toArray()我会得到“无效值用作弱映射键”错误)
问题:使用新项目更新路线模型并导致重新呈现模板的正确/Ember方法是什么。如果我应该将服务用于数据,那么服务是否应该将所有项目保留在
toArray()
或POJO中?余烬数据将自动为您完成大部分难看的关系工作
例如,你不应该做这样的事情:
model(){
// this is my "user.edit" route
let user = this.modelFor('user');
let newUserRole = this.get('store').createRecord('userRole');
newUserRole.set('user_id', user.get('id'));
return RSVP.hash({
user: user,
userRoles: store.query('userRole', { user_id: user.get('id') }),
roles: store.findAll('role'),
newUserRole: newUserRole
});
}
newUserRole.set('user_id', user.get('id'));
但总是这样:
newUserRole.set('user', user);
在.save()
上,余烬数据
足够智能,可以保存id
此外,这看起来有点像您正在尝试为给定用户加载所有userRole
s:
store.query('userRole', { user_id: user.get('id') }),
您应该仅在必要时使用query
。要获取关系,只需访问该关系:
user.get('roles'),
假设您有角色:在models/user role.js
中有许多('userRole')
接下来,使用currentModel.userRoles.addObject
修改余烬数据的结果数组。只有当你想改变关系时,你才应该这样做<代码>余烬数据
将自动保持您的关系同步。
因此,在userRole
上设置user
后,新角色将自动出现在user.get('roles')
返回的实时数组中。因此,实际上您不应该修改.query()
返回的数组
所以基本上这可能是你的模型
钩子:
// this is my "user.edit" route
let user = this.modelFor('user');
let newUserRole = this.get('store').createRecord('userRole', {
user
});
return RSVP.hash({
user,
userRoles: user.get('roles'),
roles: store.findAll('role'),
newUserRole,
});
这可能是您的保存操作:
actions: {
saveNewUserRole: function () {
let currentModel = this.modelFor('user.edit');
currentModel.newUserRole.save();
}
}
但是,如果您只想在保存新角色后显示它,那么在查看它们时,您可能应该在
isNew=false
上进行筛选。使用计算机属性,如userRolesFiltere:Ember.computed.filterBy('model.userRoles','isNew',false)
或{{{除非role.isNew}}}
。非常感谢您的回答。我现在正试图用这种方式设置页面。但是,我不能调用“user.get('roles')”来实际向服务器发出请求……或者更确切地说,我必须在调用用户时返回角色ID吗?我正在使用REST适配器,如果我不作为用户的一部分返回{roles:[role_id]},ember将不会对您需要的数据发出单独的请求。