我有一个Ember Addon,我在Github放了这个:
https://github.com/lifegadget/ember-dictionary
它通过了所有单元测试,并以非插件形式在我的一个项目中正常工作但我想将其解除出来并能够将其用作项目添加在。我仍然明显错过了如何揭露两个Ember课程的一步。这可以在虚拟应用程序中看到,它试图创建一个非常简单的模型:
import DS from 'ember-data';
import DictionaryModel from 'ember-dictionary';
export default DictionaryModel.extend({
foo: DS.attr('string')
});
然后当路由(tests/dummy/routes/index.js)尝试使用模型时,我收到以下错误:
处理路由时出错:index无法读取未定义的属性'extend'TypeError:无法读取未定义的属性'extend'
对我而言,这感觉就像是ES6 /命名空间问题,但我不确定如何克服它。我确实尝试了以下更明确的import语句:
import DictionaryModel from 'ember-dictionary/models/dictionary-model';
但发生了同样的错误。任何帮助将不胜感激。
答案 0 :(得分:0)
我碰到了足够多的墙壁,我认为我至少可以部分回答我的问题,但有些问题仍然存在,所以我不会将这个答案标记为正确,希望其他人可以发表更完整的答案。
我意识到的第一个区别是我自己还没有明确说明是要定位Ember App的命名空间还是为插件定位一个独立的命名空间。在插件的app
目录中定义的类将可用于在其自己的命名空间中使用Addon的任何应用程序。相反,addon
目录中的类将命名为addon的命名空间。
我见过很多人在插件的app
目录中定义类,然后将其代理到addon
目录,例如:
// addon/mixins/dictionary.js
import DictionaryMixin from 'ember-dictionary/mixins/dictionary';
export default DictionaryMixin;
虽然我已经看到了这一点,但我仍然无法使这些外部命名空间类工作。我认为可能需要另外一步为插件添加index.js
入口点,然后在那里导出这些类。无论如何,当我决定让内部命名空间解决方案首先工作时,我会单独留下这个区域。
我在内部命名空间解决方案中的下一个问题集中在作为插件创建过程的一部分构建的虚拟应用程序。我希望这个虚拟应用程序有一个模型,它将使用我在插件中创建的Mixin,我想我可以将它称为:
import DictionaryMixin from 'ember-dictionary/mixins/dictionary';
但Dummy测试应用程序无法解决这个问题,所以我不得不诉诸:
import DictionaryMixin from '../mixins/dictionary';
考虑到我的“外部命名空间解决方案”还没有工作,我认为这是合适的...需要回退到内部命名空间解决方案。