Ember 默认使用约定来进行依赖注入,例如如果您使用 ember-data,则应用程序启动时会自动向每个路由和控制器注入 store
类的实例,因此您可以通过在任何路由或控制器中执行 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
和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
和 inject
非常强大,但您应该明智地使用它们,只有在确实知道没有其他方式可以实现您的目标时才使用它们,我想缺乏文档是一个不鼓励使用的指标。
由于提供带有解释的工作示例大多数情况下是必须的,因此这里有一个示例:http://jsbin.com/usaluc/6/edit。请注意,在示例中,我们可以通过在每个路由中引用当前控制器的会话对象 {{controller.session.sessionHash}}
来简单地访问所提到的 sessionHash
,这是我们在应用程序中为每个控制器注册和注入了 App.Session
对象所做的工作的价值。
希望对您有所帮助。
一个常见的用例是将当前登录用户属性提供给控制器和路由,如 https://github.com/kelonye/ember-user/blob/master/lib/index.js 和 https://github.com/kelonye/ember-user/blob/master/test/index.js
Ember.Component
,你也可以使用我刚刚写完的答案:https://dev59.com/0GMl5IYBdhLWcg3wV1wF - intuitivepixel:main
,:current
等只是标签。如果您有多个具有略微不同实现的相同对象要注册,例如myObject:basic,MyObjectBasic ...
或myObject:advanced,MyObjectAdvanced ...
,则它们非常有用。希望这样说得清楚了? - intuitivepixel