2015-10-28 22 views
0

單個模型可以使用store.findRecord(modelTypeName, id);獲取;我怎樣才能得到我的應用程序中可用的所有可能的modelTypeName的列表?如何獲取所有ember-data模型類的列表?

我特別試圖從應用程序初始化程序中執行此操作。

我使用的餘燼,CLI版本1.13.8與Ember 2.1.0

編輯This question是一個重複的有點,但它不是在什麼情況下,他的工作清楚。看起來反省應該更容易實現,而不是在一般情況下你應該訪問應用程序(實例)的(實例)初始化程序中使用黑客,所以希望這個問題可以積累一些特定於該上下文的有用答案。 (例如,一個實例初始化器):;

回答

1

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類存儲對它的超類的引用,但不包括它的子類。

相關問題