Ember JS自动将目录类注册到DI

时间:2017-03-16 13:49:17

标签: ember.js dependency-injection

在Ember.JS中创建in-repo-addon提供了很多可能性。今天我偶然发现了一个案例,当时我想将目录中的所有类(例如my-dir)注册到Dependency Injector(与Ember使用services完成的方式相同,但我想要使用其他一些命名空间。)

例如,我想允许开发人员在proxy目录中创建多个类,并在proxy:命名空间下的DI中注册所有这些类。所以稍后我们可以使用:

Ember.Component.extend({
  myProxy: Ember.inject('proxy:my'),
});

1 个答案:

答案 0 :(得分:1)

您需要使用初始化程序执行此操作。有关详细信息,请访问:https://guides.emberjs.com/v2.12.0/applications/dependency-injection/

困难的部分可能是获取s文件夹中的所有代理项目以自动注册...

修改 看起来我没有花足够的时间思考这个问题。您应该能够轻松地完成至少部分内容。这有两个部分。

第1部分

Ember目前使用ember-resolver来处理各种项目的查找。如果您检查解析器的测试,您会注意到您应该能够映射到您想要的任何内容:https://github.com/ember-cli/ember-resolver/blob/master/tests/unit/resolvers/classic/basic-test.js

因此,在您的情况下,如果您从Ember实例化类(例如路由,控制器或组件)中执行Ember.getOwner(this).lookup('proxy:main'),它将查找您的插件可以填充的app/proxy/main.js

有关Ember.getOwner查询的详细信息,请访问:https://emberjs.com/api/classes/Ember.html#method_getOwner

第2部分

因此,此时您可以查找代理(在init方法中可以使用)。但是如果我们想要真正优雅,我们希望允许Ember.inject.proxy('main')语法。

这样做会涉及在初始化程序中调用Ember.inject内的私有方法。因为new Javascript modules RFC中的命名方案正在发生变化,尝试添加这种语法糖可能是不明智的......

所以我建议避免触及私有API,除非它对您的应用设计非常重要