如何以及何时使用Ember.Application注册并注入方法?
我想了解如何使用Ember.Application 注册和注入方法
这些function是为什么devise的? 他们如何使用和何时?
我真的很想知道!
在默认情况下,Ember使用大多数约定来引导应用程序时会执行dependency injection,例如,如果您使用了ember-data,则应用程序中的每个route
和controller
都会注入一个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'); } ... });
换句话说, 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
您可以注册控制器,模型,视图或任何任意对象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')
。
虽然register
和inject
是非常强大的,你应该明智地使用它们,只有在你真的知道没有其他方法来实现你的目标的情况下,我想缺乏文档是一个灰心的指标。
更新 – 没有一个工作的例子没有好的解释
由于这是一个必须提供一个工作示例的解释,它是: 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