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

Tar*_*ski 62 ember.js

我试图了解如何使用Ember.Application 寄存器注入方法

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

我真的很想知道!

int*_*xel 94

灰烬默认完成了依赖注入时,主要使用约定,例如,如果您使用的余烬数据,则实例可以启动你的应用程序store类在每一个被注入routecontroller在您的应用程序,让您可以在以后得到一个参考通过简单地做this.get('store')内部的任何路线或控制器.

例如,这里是一个代码提取,其中默认的storeget已注册(取自源代码)

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

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

    container.lookup('store:main');
  }
});
Run Code Online (Sandbox Code Playgroud)

然后注入(来源)

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');
  }
  ...
});
Run Code Online (Sandbox Code Playgroud)

换句话说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: ''
});
Run Code Online (Sandbox Code Playgroud)

此代码将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并且inject非常强大,但你应该明智地使用它们,只有在你真正知道没有其他办法实现你的目标的情况下,我想缺乏文档是沮丧的一个指标.

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

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

希望能帮助到你.

  • 我正在为Ember.js制作一个交互式备忘单,你介意我把它放在那里吗?你可以在这里看到它:http://embersherpa.com/它可能会在Em.Application.register和Em.Application.inject下.你怎么看? (2认同)