假设我有一个SessionManager
实例,我希望每个Route
扩展我的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);
答案 0 :(得分:0)
你当然可以,但可能涉及一些杂耍。你可以定义任何逻辑来决定注入什么,如果你想依赖默认约定你可以手动找到这些对象,然后在注入时使用全名。
另一种选择是为每条路线做一遍,无论它们是否包含Mixin。注入不需要全名,如果你调用`App.inject('route',...)它默认会工作。
如果选择选项1,它看起来就像这样。你基本上需要找到那些实现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.
};
});