#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
конструктору в каждом экземпляре?