2015-04-30 49 views
4

我使用Ember CLI,默认情况下它似乎设置Ember.MODEL_FACTORY_INJECTIONS = true;app.jsEmber.MODEL_FACTORY_INJECTIONS究竟做了什么?

我试着评论此行(并将其设置为false),然后我的应用程序似乎表现为某种严格模式。我得到了一堆失败的断言,因为我的一些Model关系没有明确指定inverse

这是确切的错误:

You defined the 'account' relationship on (subclass of DS.Model), but multiple possible inverse relationships of type (subclass of DS.Model) were found on (subclass of DS.Model). Look at http://emberjs.com/guides/models/defining-models/#toc_explicit-inverses for how to explicitly specify inverses

使用灰烬CLI生成应用程序与Ember.MODEL_FACTORY_INJECTIONS = true;默认的,我没有得到这些错误。所以我导致相信这个标志以某种方式改变了核心行为。

请注意!

回答

5

DS.Model,您的模型基类,只是由Ember Data定义的另一个类。为了使它具有像依赖注入这样的特殊功能,Ember需要挂接到该类,以便在实例化它时,实例引用应用程序容器。当Ember.MODEL_FACTORY_INJECTIONS处于打开状态时,Ember会将其他mixin应用于该类。

您可以使用Ember.getOwner(instance)来获取实例的应用容器(或所有者)。例如,您可以查看应用程序或控制器实例的存储。当您直接拨打MyModelClass.create()时,所有者未设置。您需要使用Ember.setOwner()或将其与现有所有者实例化。见ApplicationInstance#ownerInjection()

let owner = Ember.getOwner(this); 

User.create(
    owner.ownerInjection(), 
    { username: 'rwjblue' } 
) 

但是,许多使用Ember Data的应用程序不直接实例化模型实例,也不需要执行此操作。

您目前可以使用Ember.MODEL_FACTORY_INJECTIONS = true来选择功能,但我相信他们正在朝着未来的默认方向发展。

因此关闭此功能会导致错误,因为某些mixin未包含在您的模型类中。

+0

感谢您的明确解释。 2年后,但仍相关! –

+0

作为一个很好的补充,你可以从Ember 2.13开始删除这个标志。欲了解更多信息,请阅读:https://emberjs.com/deprecations/v2.x/#toc_ember-model-em-factory-em-injections-removed。 –