emberjs使用“需要”但其他控制器模型为空

时间:2013-11-21 03:37:40

标签: ember.js

如何在不首先进入路线的情况下加载模型?

App.UsersRoute = Em.Route.extend({
  model: function() {
      return ['bob', 'sue', 'tom'];
  },

  setupController: function(controller, model) {
    controller.set('model', model);
  }
});

使用

从另一个控制器
needs: "users"

this.get('controllers.users.content');
只要我先访问UsersRoute,

就可以正常工作。

2 个答案:

答案 0 :(得分:3)

将其加载到需要它的最顶层路线中,因此:

App.SomeOtherRoute = Em.Route.extend({
  setupController: function(controller, model) {
    controller.set('model', model);
    this.controllerFor('user').set('model', ['bob', 'sue', 'tom']);
  }
});

请注意,如果您使用的是ember-data或epf或ajax,那么该模型将是一个承诺。您无法将控制器上的模型设置为承诺,因此您可以这样做:

  setupController: function(controller, model) {
    controller.set('model', model);
    return this.get('store').findAll('user').then(function(users) {
      this.controllerFor('users').set('model', users);
    });
  }

注意在第二个我使用的是UsersController,而不是UserController,因为你似乎想要一个用户集合而不是一个用户。

答案 1 :(得分:2)

上周末我遇到了同样的问题,以下内容对我有用:

App.SomeOtherController = Ember.Controller.extend({
  needs: ['users']
});

App.SomeOtherRoute = Ember.Route.extend({
    setupController: function( controller, model ){
      this._super( controller, model );
      controller.set( 'controllers.users.model', ['bob', 'sue', 'tom'] );
    }
});

如果它是ajax调用/ ember数据,那么你需要这样的东西:

App.SomeOtherController = Ember.Controller.extend({
  needs: ['users']
});

App.SomeOtherRoute = Ember.Route.extend({
    setupController: function( controller, model ){
      this._super( controller, model );
      this.get('store').findAll('user').then(function(users) {
        controller.set( 'controllers.users.model', users );
      });
    }
});

然而,在今天的代码审查期间,一位同事向我指出,如果我需要这样做,我可能错误地构建了我的路线/资源/模型。换句话说,外部路线不应该依赖于内部路线的模型。所以我现在正在考虑返回并重构这一点,以便用户模型是外部路由的模型的一部分,然后我可以在我的内部路由控制器中使用它。