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]);
如果您需要在運行的應用程序的調試控制檯哈克一行代碼:
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:'))
較長的答案:
這些方法是一種複雜的,假設你沒有使用莢或其他任何非標準,並依靠無證內部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類存儲對它的超類的引用,但不包括它的子類。