假设我有一个SessionManager
实例,我想在扩展我的ProtectedRoute
Mixin的每个Route
中访问,是否有可能将此依赖项注入"一组路由",因为我可以引用单个路由实例?
所以不是:
App.inject('route:protected1', 'sessionManager', 'session_manager:main');
App.inject('route:protected2', 'sessionManager', 'session_manager:main');
....
我可以这样写
App.inject('route:protectedmixin', 'sessionManager', session_manager:main);
当然可以,但这可能涉及到一些杂耍。你可以定义任何逻辑来决定注入什么和在哪里,如果你想依赖默认约定,你可以手动找到这个对象,然后在注入时使用全名。
另一个选择是对每个路由都这样做,不管它们是否包含Mixin。如果你调用' App ', Inject不需要全名。Inject ('route',…)会默认工作。
如果选择选项一,它看起来像这样。你基本上需要找到那些实现它们的mixins的路由,然后注入到所有那些。
var guidForMixin = Ember.guidFor(App.YourMixin);
var routesToInjectInto = Ember.keys(App).filter(function (key) {
var route, mixins;
if (key.match(/Route$/))
route = App[key];
mixins = Ember.meta(route).mixins;
if (mixins) {
!!mixins[guidForMixin];
}
return false;
);
routesToInjectInto.each( function (key) {
var keyForInjection = Ember.decamelize(key);
App.inject('route:' + keyForInjection, 'sessionManager', 'session_manager:main');
});
我还建议在初始化器中完成所有这些,但这可能是一个次要考虑。
Ember.onload('Ember.Application', function(Application) {
Application.initializer {
name: "sessionManager"
initialize: function (container, application) {
// do the above here. Refer to app as the namespace instead of App.
// use the container instead of App.__container__ to register.
};
});