如何以及何时使用Ember.Application寄存器和注入方法?

时间:2013-08-13 13:02:39

标签: ember.js

我正在尝试了解如何使用Ember.Application register& inject方法

这些功能设计用于哪些用例? 它们如何使用以及何时使用?

我真的很想知道!

2 个答案:

答案 0 :(得分:94)

默认情况下,Ember在使用大多数约定引导应用程序时执行依赖注入,例如,如果使用ember-data,则store类的实例将注入每个route和{{1在您的应用程序中,您可以稍后通过在任何路由或控制器中执行controller来获取引用。

例如,这里是一个代码提取,其中默认this.get('store')获取已注册(取自source

store

然后注入(source

Ember.onLoad('Ember.Application', function(Application) {
  Application.initializer({
    name: "store",

    initialize: function(container, application) {
      application.register('store:main', application.Store);
      ...
    }

    container.lookup('store:main');
  }
});

换句话说,Application.initializer({ name: "injectStore", initialize: function(container, application) { application.inject('controller', 'store', 'store:main'); application.inject('route', 'store', 'store:main'); application.inject('dataAdapter', 'store', 'store:main'); } ... }); register是注册依赖项并自己注入它们的方法。

假设您有一个inject对象,您在应用程序启动时收到服务器请求后填充该对象,并且您想要在每个控制器中引用它,您可以执行以下操作:

Session

此代码会将每个控制器实例的var App = Ember.Application.create({ ready: function(){ this.register('session:current', App.Session, {singleton: true}); this.inject('controller', 'session', 'session:current'); } }); App.Session = Ember.Object.extend({ sessionHash: '' }); 属性设置为session的单例实例,因此您可以在任何控制器中执行App.Session并获取对它的引用,它被定义为单例,它总是相同的this.get('session')对象。

使用session,您可以注册控制器,模型,视图或任意对象类型。另一方面,register可以注入给定类的所有实例。例如,inject也会将带有inject('model', 'session', 'session:current')实例的session属性注入所有模型。要注入session:current对象,让我们说session你可以做IndexView

尽管inject('view:index', 'session', 'session:current')register非常强大,但您应该明智地使用它们,并且只有在您确实知道没有其他方法可以实现目标的情况下,我认为缺少文档是一个指标沮丧。

更新 - 没有实例

没有好的解释

因为提供一个解释的工作示例是必须的,所以它是:http://jsbin.com/usaluc/6/edit。请注意,在示例中,我们可以通过在我们所在的每个路径中使用inject引用当前控制器的会话对象来简单地访问提到的sessionHash,这是我们通过注册和注入所做的工作的优点应用程序中每个控制器中的{{controller.session.sessionHash}}对象。

希望它有所帮助。

答案 1 :(得分:8)

一个常见的用例是将当前登录的用户属性提供给控制器和路由,如https://github.com/kelonye/ember-user/blob/master/lib/index.jshttps://github.com/kelonye/ember-user/blob/master/test/index.js