EmberJS: ввод владельца в собственный класс из компонента

#javascript #class #ember.js

#javascript #класс #ember.js

Вопрос:

То, что я пытаюсь сделать, это ввести владельца в мой собственный класс JS в Ember (3.15.0). Это выглядит примерно так:

   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

Я видел похожие вопросы, которые были решены с помощью using getOwner(this).ownerInjection() , но все они были основаны на Class.create() том, что было расширено Ember.Объект.

Есть ли какой-нибудь способ сделать это?

Заранее спасибо за любую помощь.

Ответ №1:

Способ сделать это в современном 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.js,

Смотрите Документацию setOwner здесь:

https://api.emberjs.com/ember/3.22/functions/@ember/application/setOwner

Этот ответ должен работать в Ember 3.15 и является текущим по состоянию на Ember 3.23.

Кстати, это сообщение об ошибке действительно может использовать обновление из container -> owner

Комментарии:

1. Похоже, это отлично работает, спасибо!. Законно ли использовать SetOwner для такого рода проблем? Я спрашиваю, поскольку в Интернете почти нет упоминаний об этом, а документация для него довольно скудная.

2. Поскольку это общедоступный api, я думаю, что его вполне законно использовать. Что касается лучшей документации, я бы спросил на канале dev-learning-team в Ember Discord.

3. Это своего рода расширенная функция, нет, я не удивлен отсутствием разговоров об этом. Но в каждом проекте / задании, которое я видел, часто можно увидеть что-то с помощью SetOwner

4. Отличная дискуссия. Есть ли способ с setOwner помощью инициализатора (может быть, экземпляра?), Вместо того, чтобы передавать owner конструктору в каждом экземпляре?