如何以及何时使用Ember.Application注册并注入方法?

我想了解如何使用Ember.Application 注册和注入方法

这些function是为什么devise的? 他们如何使用和何时?

我真的很想知道!

在默认情况下,Ember使用大多数约定来引导应用程序时会执行dependency injection,例如,如果您使用了ember-data,则应用程序中的每个routecontroller都会注入一个store类的实例,以便您稍后可以通过简单在任何路由或控制器中执行this.get('store')

例如,这里是一个代码提取,默认store get的注册(从源获取 )

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

换句话说, registerinject是注册依赖关系并注入它们的方法。

让我们假设你有一个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您可以注册控制器,模型,视图或任何任意对象types。 inject ,另一方面,可以注入给定类的所有实例 。 例如, inject('model', 'session', 'session:current')也会将session:current实例的session属性注入到所有模型中。 要注入session对象,让我们IndexView你可以inject('view:index', 'session', 'session:current')IndexView inject('view:index', 'session', 'session:current')

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

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

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

希望能帮助到你。

一个常见的用例是将当前的login用户属性提供给控制器和路由,如https://github.com/kelonye/ember-user/blob/master/lib/index.js和https://github.com/ kelonye /余烬用户/斑点/主/testing/ index.js