使用需要将对象注入Ember.js中的其他对象

时间:2014-11-29 05:18:28

标签: javascript ember.js dependency-injection

我想了解needs属性是否可用于将任意对象注入控制器,路由和视图。

我正在开发一个Ember.js应用程序,我正在编写一个自定义数据服务层,它与后端通信以加载和保存数据。我定义了Ember Objects,它代表了各种后端服务,例如:

App.SessionServiceClient = Em.Object.extend({
  // methods and attributes
});

App.UserServiceClient = Em.Object.extend({
  // methods and attributes
});

我现在使用应用程序的容器注册这些对象,以使它们可用于DI:

App.register('service:session', App.SessionServiceClient, {singleton: false});
App.register('service:user', App.UserServiceClient, {singleton: false});

现在对象可以注入,如果我有一个只需要SessionServiceClient的控制器,我可以执行以下操作:

App.SignInController = Em.ObjectController.extend({
  needs: ['service:user'],                  // using the needs to declare dependency
  actions: {
    // actions for the view
  }
});

当我尝试这个时,它没有用。这可能与Ember.js或我做错了吗?

1 个答案:

答案 0 :(得分:1)

最佳做法是使用初始化程序将您的服务注入您需要的控制器中。见http://ember.zone/ember-application-initializers/

Ember.Application.initializer({
 name: "sessionLoader",
 after: "store",

 initialize: function(container, application) {
    container.register('service:session', App.SessionServiceClient, {singleton: false});
    container.injection('route', 'session', 'service:session');
    container.injection('controller', 'session', 'service:session');
  });
}
});

此外,您应该尝试切换到Ember-CLI或至少使用ES6模块结构。 (即使用导入而不是全局变量。)