Ember.js:是否可以在特定的路由/控制器Mixin中注入依赖?



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

相关内容

  • 没有找到相关文章

最新更新