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

med*_*kin 6 ember.js ember-data

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

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

谢谢 :)

@编辑

kingpin2k的答案有效,但在Ember-Cli中没有,还有另一种方法吗?

Ale*_*mes 7

所以,对于Ember Cli来说,没有一个我能找到的直接解决方案.但是,您可以通过一些创意编码和分析ember-inspector的来源解决问题.

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

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

要使"config.modulePrefix"部分起作用,您需要导入conf文件(修复路径):

import config from '../config/environment';
Run Code Online (Sandbox Code Playgroud)

或者,您可以将"config.modulePrefix"硬编码为"myappname"或使用此代码:

this.container.resolver.__resolver__.namespace.modulePrefix
Run Code Online (Sandbox Code Playgroud)

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

require(_the_model_module_name).default
Run Code Online (Sandbox Code Playgroud)


Tam*_*ger 6

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

// in a route
// routes/route.js
import Ember from 'ember'

const { Route, getOwner } = Ember

export default Route.extend({
  model: function(){
    return getOwner(this)
    .lookup('data-adapter:main')
    .getModelTypes()
    .map(type => type.name)
  }
})

// somewhere else in an ember application
const modelNames = getOwner(this)
.lookup('data-adapter:main')
.getModelTypes()
.map(type => type.name)
Run Code Online (Sandbox Code Playgroud)

这里是链接灰烬管理员在GitHub上.


Kin*_*n2k 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);     
      }
 }
Run Code Online (Sandbox Code Playgroud)

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