【问题标题】:How to get a list of all ember-data Model classes?如何获取所有 ember-data 模型类的列表?
【发布时间】:2015-10-28 03:58:00
【问题描述】:

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

我专门尝试在应用初始化程序中执行此操作。

我正在使用 ember-cli 版本 1.13.8 和 Ember 2.1.0

编辑This question 有点重复,但不清楚他在什么背景下工作。与一般情况相比,如果您应该访问应用程序(实例)的(实例)初始化程序中没有黑客攻击,似乎自省应该更容易实现,因此希望这个问题可以积累一些特定于该上下文的有用答案。

【问题讨论】:

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


    【解决方案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]);
    

    如果您需要在正在运行的应用程序的调试控制台中使用 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 类存储对其超类的引用,而不是对其子类的引用。

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 1970-01-01
      • 2015-04-12
      • 2019-02-05
      • 2013-11-21
      • 2016-03-07
      • 2013-06-24
      • 2013-11-22
      • 1970-01-01
      相关资源
      最近更新 更多