Ember.js - 获取所有型号名称

时间:2014-08-04 18:14:12

标签: ember.js ember-data

我正在尝试在我的Ember应用程序(v1.8)中获取所有已定义模型的列表。

据我所知,Container.resolver可以使用一些神秘的魔法。 Container是否包含所有活动模型的列表,或者有任何方法可以获取它们吗?

谢谢:)

@edit

kingpin2k的答案有效,但在Ember-Cli中没有,还有其他方法吗?

4 个答案:

答案 0 :(得分:7)

所以,对于Ember Cli来说,我找不到直接的解决方案。但是,您可以通过一些创造性的编码和分析ember-inspector的来源解决问题。

var models = Object.keys(require._eak_seen).filter(function(module) {
    return module.indexOf(config.modulePrefix + '/models/') === 0;
});

此代码段迭代使用requirejs注册的模块,并仅提取所需的模块(在我们的示例中为模型)。

对于" config.modulePrefix"部分工作,您将需要导入您的conf文件(修复路径):

import config from '../config/environment';

或者你可以硬编码" config.modulePrefix"到" myappname"或者用这个:

this.container.resolver.__resolver__.namespace.modulePrefix

PS:要检查您需要使用的模型:

require(_the_model_module_name).default

答案 1 :(得分:6)

所以我添加了这个,因为我遇到了我认为现在最好的解决方案(post ember-cli和ember容器更改):

net localgroup administrators "domainname\G-${env:COMPUTERNAME}-LocalAdmins" /add

以下是linksourceember-admin on github

答案 2 :(得分:4)

真的,最简单的方法就是迭代命名空间并查找超类为DS.Model的对象

 for (var key in App) {
      var value = App[key],
          superClass = value ? value.superclass : undefined;

      if (superClass && superClass === DS.Model) {
        console.log(value);     
      }
 }

http://emberjs.jsbin.com/OxIDiVU/899/edit

答案 3 :(得分:3)

在尝试执行此操作时specficically in an initializer,这是我发现的内容(使用带有Ember 2.1.0的ember-cli版本1.13.8 - 即截至今天的当前版本):

TL; DR:

从您的代码中(例如我的实例初始化程序):

YourAppName.__container__
  .lookup('container-debug-adapter:main')
  .catalogEntriesByType('model')
  .filter((name) => YourAppName.__container__.lookupFactory('model:' + name));

如果你需要在正在运行的应用程序的调试控制台上使用hacky one-liner:

Object.keys(YourAppName.__container__.factoryCache).filter((i) => i.startsWith('model:'))

或者,只获得已经加载的模型(这是你的意思"活跃模型"?):

var debugAdapter = appInstance.lookup('container-debug-adapter:main');
var modelNames = debugAdapter.catalogEntriesByType('model');

更长的答案:

这些方法有点复杂,假设您没有使用pod或其他任何非标准的方法,并且依赖于未记录的内部API。它们还特定于ember-resolver(在ember-cli和Ember App Kit中使用的基于ES6模块的查找系统)。所以不太理想。

它实际上应该如此简单:

Ember.Namespace.NAMESPACES

不幸的是ContainerDebugAdapter class included with ember-resolver是错误的,所以它会返回一堆额外的项目。

希望很快就能解决这个问题(我已经提交了bug report),但在此之前,上面的代码应该可以提供。

有趣的是,这种基于字符串的匹配基本上是ContainerDebugAdapter在内部执行的操作(incorrectly)。 ContainerDebugAdapter that ships with Ember在应用程序范围的命名空间(get_first: lw $s0, vek # 1. Load the word stored at location 'vek' into $s0. addi $s1, $zero, 0 # 2. Load zero into $s1. This will store an offset into 'vek', in bytes. loop_1: la $s2, vek($s1) # 3. Load the *address* of the $s1-th word of 'vek' into $s2. This is the location you want to write to. addi $s1, $s1, 4 # 4. Advance the $s1 pointer to the next word in 'vek'. lw $s3, vek($s1) # 5. Load the *value* of the $s1-th word of 'vek' into $s3. This is the value you want to copy. sw $s3, ($s2) # 6. Store the value obtained in line 5 into the location obtained in line 3. blt $s1, 400, loop_1 # 7. Repeat until we have iterated over all memory in 'vek'. set_last: sw $s0, vek + 396 # 8. Store the value obtained in line 1 into the end of 'vek'. )中查找对象也是同样的事情。

我意识到Ember(特别是ember-cli)非常受名称约定驱动,但这个正则表达式匹配感觉有点疯狂。在我看来,理想情况下,我们改为导入DS.Model类并获取它的子类。不幸的是,似乎并不是(容易)可能的:据我所知,Ember类存储对它的超类的引用,但不存储它的子类。