如何获取所有ember-data模型类的列表?

时间:2015-10-28 03:58:00

标签: ember.js ember-data ember-cli

可以使用store.findRecord(modelTypeName, id);获取单个模型;如何获取我的应用中可用的所有modelTypeName列表?

我特意尝试在app初始化程序中执行此操作。

我正在使用带有Ember 2.1.0的ember-cli版本1.13.8

编辑This question有点重复,但目前尚不清楚他在哪种情况下工作。在一个(实例)初始化器中你应该访问应用程序(实例)而不是一般情况下看起来内省应该更容易实现,所以希望这个问题可以积累一些特定于该上下文的有用答案。

1 个答案:

答案 0 :(得分:1)

TL; DR:

从代码中(例如实例初个化程序):

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类存储对它的超类的引用,但不存储它的子类。