Ember.js Emberjs 2.0+;使用存储中的新数据更新路线模型(createRecord)

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.

我是新加入灰烬的,所以我的方法可能是不正确的。 我正在使用最新的Ember 2.9.1

我的计划是更新管线的模型,并使所有组件呈现集合中新添加/保存的项目

(我想在调用保存后(在创建记录上),用用户角色的新记录更新路由模型(用户角色数组)

到目前为止,我有一个路线,它有一个模型,如下所示:

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将不会对您需要的数据发出单独的请求。