【问题标题】:Inject a service into an Ember Object [not an Ember Controller]将服务注入 Ember 对象 [不是 Ember 控制器]
【发布时间】:2016-01-24 00:42:39
【问题描述】:

我正在尝试将 Ember 服务注入到 Ember 对象中,但不断收到以下错误:

"Assertion Failed: Attempting to lookup an injected property on an
object without a container, ensure that the object was instantiated 
via a container."

我的代码基本上如下所示:

const Model = Ember.Object.extend({
  store: Ember.inject.service(),

  destroyRecord() {...},

  serialize() {...},

  deserialize() {...},
});

let newModel = Model.create();
newModel.get('store');

注意:如果我将服务注入控制器而不是对象,它确实有效。试图弄清楚如何将对象注册到 Ember 容器中,但没有任何运气。

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    它适用于Ember.Controller,因为 Ember 控制着对象的生命周期。简而言之,当 Ember 需要某个控制器的实例时,它会向容器请求一个,容器会提供该实例,必要时进行初始化。

    这意味着要使依赖注入起作用,您需要通过容器获取Model 的新实例。假设 Ember 2.3 是因为 getOwner,而 this 位于 Ember 应用程序内部:

    let owner = Ember.getOwner(this);
    let newModel = owner.lookup('object:model');
    newmodel.get('store');
    

    您可以咨询lookup documentation here

    但是如何注册呢?使用应用初始化器:

    $ ember generate initializer register-model
    

    然后,打开生成的初始化程序,假设您的文件在 app/folder/model.js 中,输入如下内容:

    import Model from 'app-name/folder/model';
    
    export function initialize(application) {
      application.register('object:model', Model);
    }
    
    export default {
      name: 'register-model',
      initialize
    };
    

    您可以咨询register documentation here

    希望对您有所帮助!

    【讨论】:

    • 因此,澄清一下,注册尚未成为 Ember 生命周期一部分的对象(在我的例子中是模型)是使用初始化程序完成的。要在应用程序的其他地方检索模型类,请致电Ember.getOwner(this).lookup('object:model'),是吗? (查找调用显然既检索了 Model 类,又调用了 .create() )。在我的情况下,只需通过 import Model from 'path/to/model; 在所有必要文件的顶部导入同样有效,因为我仍然可以与静态方法进行交互。
    • 简而言之,是的。除非您希望 Ember 管理生命周期,否则您实际上并不需要注册它们,所以 importing 就像您说的那样很好。如果您想更详细地讨论,请在 Slack 小组中联系我!
    • 实际上,再看一遍,我意识到只需通过 import Model from path/to/model' 导入;` 无需通过 Ember.getOwner(this).lookup(...) 从已注册的对象中进行查找仍然会引发同样的错误。一旦我收集到关于我的智慧,就会联系 Slack。
    【解决方案2】:

    您需要在创建模型实例时传入容器实例。容器可以通过this.get('controller') 在路由、控制器、组件中访问。 AFAIK 基本上用容器创建的任何东西都会获得容器属性集。这就是为什么服务注入在控制器等中起作用的原因。

    因此,如果您在路线的方法中创建模型。代码如下所示

    App.IndexRoute = Ember.Route.extend({
      model: function() {
        var newModel = Model.create({
          container: this.get('container')
        });    
        return newModel.get('test').getText();
      }
    });
    

    Here is a working demo.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多