可以使用store.findRecord(modelTypeName, id);
获取单个模型;如何获取我的应用中可用的所有modelTypeName
列表?
我特意尝试在app初始化程序中执行此操作。
我正在使用带有Ember 2.1.0的ember-cli版本1.13.8
编辑:This question有点重复,但目前尚不清楚他在哪种情况下工作。在一个(实例)初始化器中你应该访问应用程序(实例)而不是一般情况下看起来内省应该更容易实现,所以希望这个问题可以积累一些特定于该上下文的有用答案。
答案 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类存储对它的超类的引用,但不存储它的子类。