Ember.js:是否可以在特定的Route / Controller Mixin上注入依赖项?

时间:2014-03-26 09:15:25

标签: ember.js ember-app-kit

假设我有一个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);

1 个答案:

答案 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. 
    };
});