62

我正在尝试了解如何使用 Ember.Application注册注入方法

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

我真的很想知道!

4

2 回答 2

94

默认情况下,Ember 在引导您的应用程序时使用大多数约定进行依赖注入,例如,如果您使用 ember-data,则store该类的实例会被注入到每个应用程序routecontroller,因此您以后可以通过简单地this.get('store')在任何内部执行来获得引用路由或控制器。

例如,这里是一个代码提取,其中store注册了默认获取(取自

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,andinject是注册依赖并自己注入它们的方法。

假设您有一个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').

虽然registerinject非常强大,但您应该明智地使用它们,并且只有在您真正知道没有其他方法可以实现您的目标的情况下,我想缺乏文档是一种灰心的指标。

更新-没有工作示例就没有很好的解释

由于提供一个带有解释的工作示例几乎是必须的,因此它是:http: //jsbin.com/usaluc/6/editsessionHash请注意,在示例中,我们如何通过在我们所在的每个路由中引用当前控制器的会话对象来简单地访问提到的对象,这是我们通过在应用程序中的每个控制器中{{controller.session.sessionHash}}注册和注入对象所做的事情的优点。App.Session

希望能帮助到你。

于 2013-08-13T13:20:26.263 回答
8

A common use case is to provide the current loggedin user property to controllers and routes as in https://github.com/kelonye/ember-user/blob/master/lib/index.js and https://github.com/kelonye/ember-user/blob/master/test/index.js

于 2013-08-14T12:33:33.643 回答