将未保存的模型传递给控制器

时间:2014-07-10 18:48:56

标签: ember.js

我有以下路由器:

router.js:

var Router = Ember.Router.extend({
  location: AppENV.locationType
});

Router.map(function() {
  this.resource('groups', { path: '/groups' }, function() {
    this.resource('members', { path: ':group'});
  });
});

export default Router;

这会在路线/groups和路线/groups/<groupId>处呈现一个侧边栏,它会显示侧边栏以及所选组内的成员。应用程序的主视图包含有关所选组的信息。

到目前为止这一切都很好。但是我的想法是,在创建新组时,我希望使用路由/groups/new显示未保存的组,并在应用程序的主视图中显示有关该特定未保存组的详细信息。

所以,我有成员的这条路线:

/routes/members.js:

export default Ember.Route.extend({
  model: function (params) {
    return Ember.RSVP.hash({
      members: this.store.find('member', {group: params.group}),
      group: this.store.find('group', params.group)
    });
  },
  setupController: function(controller, model){
    this._super(controller,model);
    this.controllerFor('group').set("group", model.group);
  },
  renderTemplate: function(controller, model) {
    this.render('members',{
      outlet:'sidebar-members'
    });
    this.render('group', {controller: 'group'});
  }
});

这将加载当前所选组的成员和所选组本身,并呈现两个模板:成员侧栏列表和包含组模板的主视图。同样,这适用于已有的条目。

现在我发现这个stackoverflow [1]描述了我应该能够在路由/groups/new下创建一个新创建的组。所以,我在上面显示的成员路由中添加了一个序列函数:

  serialize: function(model, params) {
    if (model && model.get('isNew')) {
      // corresponds to path '/groups/:group'
      return { group: 'new'}
     }
    return this._super(model, params);
  },

我现在可以使用组控制器创建一个新组并转换到该路由:

控制器/ groups.js:

export default Ember.ArrayController.extend({
  actions: {
    create: function() {
      var group = this.store.createRecord('group', {
        name: 'test'
      });
      this.transitionToRoute('members', group);
    },
  }
});

这适用于侧边栏:添加了一个新组。路线/groups/new显示在浏览器中。但是,新组未传递到主视图,后者呈现组模板。组变量似乎在模板内和组控制器中未定义。我没有在模型上设置id并将id设置为“new”,我尝试了两种方法。似乎没有任何改变。

是否有更好的方法可以做到这一点,或者我是如何做某事的特定错误?

[1] Ember: unsaved models in dynamic URLs

1 个答案:

答案 0 :(得分:1)

我认为这是因为如果您提供上下文,则不会执行具有动态段的Route中的model挂钩。但是,在这种情况下,model会返回一个承诺哈希,而在GroupsController中,您会为其提供一个群组模型。因此,当您在model.group中致电setupController时,它会在您的群组模型上获得属性group。因此它无法正常工作。所以不要做

this.transitionToRoute('members', group);

this.transitionToRoute('members', Ember.RSVP.hash({
  group: group,
  members: group.members
}));