tl;博士:
在您的代码中(例如,实例初始化程序):
import ModuleRegistry from 'ember-resolver/utils/module-registry';
...
var modelRegexp = /^[a-zA-Z0-9-_]+\/models\/(.*)$/;
var modelNames = new ModuleRegistry()
.moduleNames()
.filter((name) => modelRegexp.test(name))
.map((name) => modelRegexp.exec(name)[1]);
如果您需要在正在运行的应用程序的调试控制台中使用 hacky one-liner:
YourAppName.__container__
.lookup('container-debug-adapter:main')
.catalogEntriesByType('model')
.filter((name) => YourAppName.__container__.lookupFactory('model:' + name));
或者,只获取已经加载的模型:
Object.keys(YourAppName.__container__.factoryCache).filter((i) => i.startsWith('model:'))
更长的答案:
这些方法有点复杂,假设您没有使用 pod 或任何其他非标准,并且依赖于未记录的内部 API。它们也特定于ember-resolver(ember-cli 和 Ember App Kit 中使用的基于 ES6 模块的查找系统)。所以不太理想。
其实应该这么简单:
var debugAdapter = appInstance.lookup('container-debug-adapter:main');
var modelNames = debugAdapter.catalogEntriesByType('model');
不幸的是,ContainerDebugAdapter class included with ember-resolver 有问题,所以它会返回一堆额外的项目。
希望这将很快得到解决(我已提交bug report),但在那之前,上面的代码应该可以使用。
有趣的是,这种基于字符串的匹配基本上是 ContainerDebugAdapter 在内部所做的 (incorrectly)。 ContainerDebugAdapter that ships with Ember 在应用范围的命名空间 (Ember.Namespace.NAMESPACES) 中查找对象时执行相同的操作。
我意识到 Ember(尤其是 ember-cli)非常受名称约定驱动,但这种正则表达式匹配感觉有点疯狂。在我看来,理想情况下,我们应该导入 DS.Model 类并获取它的子类。不幸的是,这似乎(很容易)不可能:据我所知,Ember 类存储对其超类的引用,而不是对其子类的引用。