答案 0 :(得分:94)
默认情况下,Ember在使用大多数约定引导应用程序时执行依赖注入,例如,如果使用ember-data,则store
类的实例将注入每个route
和{{1在您的应用程序中,您可以稍后通过在任何路由或控制器中执行controller
来获取引用。
例如,这里是一个代码提取,其中默认this.get('store')
获取已注册(取自source)
store
然后注入(source)
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
可以注入给定类的所有实例。例如,inject
也会将带有inject('model', 'session', 'session:current')
实例的session
属性注入所有模型。要注入session:current
对象,让我们说session
你可以做IndexView
。
尽管inject('view:index', 'session', 'session:current')
和register
非常强大,但您应该明智地使用它们,并且只有在您确实知道没有其他方法可以实现目标的情况下,我认为缺少文档是一个指标沮丧。
因为提供一个解释的工作示例是必须的,所以它是:http://jsbin.com/usaluc/6/edit。请注意,在示例中,我们可以通过在我们所在的每个路径中使用inject
引用当前控制器的会话对象来简单地访问提到的sessionHash
,这是我们通过注册和注入所做的工作的优点应用程序中每个控制器中的{{controller.session.sessionHash}}
对象。
希望它有所帮助。
答案 1 :(得分:8)