EmberJS:将所有者从组件注入本机 class

EmberJS: Injecting owner to native class from component

我想做的是在 Ember(3.15.0) 中将所有者注入我的 JS 本机 class。 它看起来像这样:

  component.ts

  export default class ClassOne extends Component {
    constructor() {
      super(...arguments);
      const myClass = new ClassTwo();
      ...
    }
  }

  ClassTwo.ts

  export default class ClassTwo {
    @service() someService: ServiceType;
    ...
  }
  

因此,在 someService 上,我变得可以期待 Attempting to lookup an injected property on an object without a container, ensure that the object was instantiated via a container

我见过使用 getOwner(this).ownerInjection() 解决的类似问题,但这些都是基于 Ember.Object 扩展的 Class.create()

有什么办法吗?

在此先感谢您的帮助。

在现代 Ember 中执行此操作的方法是使用 setOwner

import { setOwner } from '@ember/application';
import { inject as service } from '@ember/service';

export default class MyClass {
  @service myService;
  
  constructor(owner) {
    setOwner(this, owner);
    this.appName = this.myService.appName;
  }
}

看到它在这里工作:https://ember-twiddle.com/e6481c33c3150e3418606e79decaed78?openFiles=classes.my-class%5C.js%2C

在此处查看 setOwner 的文档:

https://api.emberjs.com/ember/3.22/functions/@ember%2Fapplication/setOwner

这个答案应该适用于 Ember 3.15+,并且是 Ember 3.23 的最新版本。

顺便说一下,该错误消息实际上可以使用容器 -> 所有者的更新