会话注入不适用于自定义类

时间:2013-12-14 18:15:49

标签: javascript ember.js dependency-injection

依赖注入适用于路由和控制器,但我很难使用自定义类。路由和控制器类的实例由Ember自动实例化,这可能是问题所在。下面的例子应该说明问题。我尝试在路由,控制器和自定义模型类中注入一个会话单例,它扩展了Ember.Object。一切都适用于路由和控制器,但它不适用于自定义模型类。

问题可能是user是使用App.User.create创建的,因此它不是由应用程序的容器管理的吗?在控制台中,我创建了一个App.IndexRoute的实例,并且该实例也没有注入会话。我在这里俯瞰什么?

要清楚,我已经查看过其他注册/注入示例(甚至是Ember源代码中的那些),但似乎我在Ember中缺少依赖注入的一个关键方面。

更新以下示例仅是一个示例来说明问题,因为人们不希望将会话单例注入每个用户模型。真正的问题是如果该实例不是由应用程序的容器创建的,如何将单例对象注入实例。

App = Ember.Application.create();

App.Session = Ember.Object.extend({
  user: 'defaultUser'
});

App.User = Ember.Object.extend({
  first: '',
  last: ''
});

App.initializer({
  name: 'session',
  initialize: function(container, application) {
    application.register('session:main', App.Session);
    application.register('model:user', App.User, { singleton: false });

    application.inject('route', 'session', 'session:main');
    application.inject('controller', 'session', 'session:main');
    application.inject('model:user', 'session', 'session:main');
  }
});

App.IndexRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    this._super(controller, model);

    var user = App.User.create({
      first: 'bart',
      last: 'jacobs'
    });

    console.log(this.get('session'));          // returns `session` singleton
    console.log(controller.get('session'));    // returns `session` singleton
    console.log(user.get('session'));          // returns `undefined`
  }
});

1 个答案:

答案 0 :(得分:1)

你是现实,这是因为你正在创建模型,而不是处理DI的容器。