我正在尝试了解如何使用 Ember.Application注册和注入方法
这些功能是为什么用例设计的?它们如何使用以及何时使用?
我真的很想知道!
默认情况下,Ember 在引导您的应用程序时使用大多数约定进行依赖注入,例如,如果您使用 ember-data,则store
该类的实例会被注入到每个应用程序route
中controller
,因此您以后可以通过简单地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')
.
虽然register
和inject
非常强大,但您应该明智地使用它们,并且只有在您真正知道没有其他方法可以实现您的目标的情况下,我想缺乏文档是一种灰心的指标。
由于提供一个带有解释的工作示例几乎是必须的,因此它是:http: //jsbin.com/usaluc/6/edit。sessionHash
请注意,在示例中,我们如何通过在我们所在的每个路由中引用当前控制器的会话对象来简单地访问提到的对象,这是我们通过在应用程序中的每个控制器中{{controller.session.sessionHash}}
注册和注入对象所做的事情的优点。App.Session
希望能帮助到你。
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