ember.js – 如何和何时使用Ember.Application注册和注入方法?

我试图理解如何使用Ember.Application register& inject方法

这些功能设计用于什么用例?
如何使用它们和什么时候?

我真的很想知道!

Ember默认情况下在使用大多数约定引导应用程序时执行依赖注入,例如,如果使用ember-data,则在应用程序中的每个路由和控制器中都注入存储类的实例,以便稍后可以通过简单在任何路由或控制器内执行this.get(‘store’)。

例如这里是一个代码提取其中默认存储get注册(取自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');
  }
});

然后注射(source)

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: ''
});

这个代码将每个控制器实例的会话属性设置为一个单例的App.Session实例,所以你可以在任何控制器做this.get(‘session’)并获得一个引用,并且由于它被定义为单例将始终是相同的会话对象。

使用寄存器,您可以注册控制器,模型,视图或任何任意对象类型。注入,另一方面,可以注入给定类的所有实例。例如inject(‘model’,’session’,’session:current’)也会将session:current实例的会话属性注入到所有模型中。要注入会话对象,让我们说到IndexView,你可以注入(‘view:index’,’session’,’session:current’)。

虽然注册和注入非常强大,你应该明智地使用它们,只有在你真的知道没有其他方法来实现你的目标,我想缺乏文档是一个沮丧的指标。

更新 – 没有一个工作示例没有良好的解释

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

希望它有帮助。

http://stackoverflow.com/questions/18209862/how-and-when-to-use-ember-application-register-and-inject-methods

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:ember.js – 如何和何时使用Ember.Application注册和注入方法?