【问题标题】:Passing an unsaved model to the controller将未保存的模型传递给控制器
【发布时间】:2014-07-10 18:48:56
【问题描述】:

我有以下路由器:

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 设置为“新”。似乎没有任何改变。

有没有更好的方法来做到这一点,或者我尝试做事的方式是否存在特定错误?

[1]Ember: unsaved models in dynamic URLs

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    我认为这是因为如果您提供上下文,则不会执行具有动态段的 Route 中的 model 钩子。但是,在这种情况下,model 返回一个承诺哈希,而在您的 GroupsController 中,您为它提供了一个 Group 模型。因此,当您在 setupController 中调用 model.group 时,它会在您的 Group 模型上获得属性 group。因此它不起作用。所以不要这样做

    this.transitionToRoute('members', group);
    

    试试

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

    【讨论】:

    • 啊,谢谢。好像就是这样。此外,我需要更改序列化程序中的 if 语句,以不直接在模型上直接调用 get 方法:if (model && model.group && model.group.get('isNew')) {
    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多