2015-04-30 183 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。 –