расширяет его мета информацию? Мне в общем нужно через декоратор в компонент запровайдить сервис.
а как доступ к нему подразумевается делать? к сервису я имею в виду И почему не использовать обычную инъекцию через конструктор?
Я может неправильно выразился... Мне сервис нужно запровайдить в компонент чтоб получить его новый инстанс. @Component({..., providers: [myService]}) Хотел написать декоратор типа @UseMyService который бы в providers компонента, добавил мой сервис. 1. да, можно не заморачиваться и в каждый компонент провайдить ручками. 2. хочется сделать это через декоратор, т.к. сервисов которые я хочу добавить к компоненту возможно будет больше, т.к. данные сервисы могут быть использованы во множестве компонентов, короче хотелось бы сделать код чище. Но судя по ишью https://github.com/angular/angular/issues/13777 такое пока сделать нельзя 😞
а можете задачу описать? Просто не могу придумать, когда есть действительно большое количество компонентов (разных) в каждый из которых нужно свой инстанс какого то общего сервиса)
Если у вас есть опыт работы с React, то наверняка знаете о механизме контекстов. Дак вот, подобное в angular можно сделать через провайдеры и их переопределение на уровне компонента. Вот так выглядит у меня сервис @Injectable({ providedIn: "root" }) export class ThemeService { constructor( @Optional() @SkipSelf() private parentTheme: ThemeService, @Inject(THEME_MODE) private mode, @Inject(DOCUMENT) private document ) {} Мне нужно реализовать механизм темизации. Я инжекчу данный сервис в app.module и получаю глобальные настройки темы. Например у меня есть как-то "тупой" компонент (tooltip), который инжектит данные сервис и получает настройки темы. Есть еще компонент (Hero) который использует где-то внутри себя компонент tooltip и он (Hero) должен переопределить настройки темы для компонента tooltip.
Вот тут экспериментирую https://stackblitz.com/edit/angular-ivy-metadecorator?file=src/app/hello.component.ts
а может тогда вообще проще в каждый компонент в providers передавать вызов какой то вашей функции которая вернёт все сервисы нужные? Вам в случае даже с вашим кастомным декоратором придётся явно в каждом компоненте менять дефолтный декоратор А так просто подмените ему providers типа providers: getMyProviders()
Я правильно понимаю, что в 'умный' компонент нужно провайдить сервис ТОЛЬКО если он хочет перекрыть тему для дочернего?
Про этот вариант да, знаю, его я сразу сделал, но думал возможно есть способ сделать это через декоратор на компонент.
Мне кажется вариант с перекрытием декоратора менее явный и не уверен, что более удобный)
насколько я знаю сейчас нет "легальных" способов это сделать и тащемта нет смысла заморачиваться. не сделали они еще :)
Можно наверное конечно свой билдер написать, но это уже через чур))
Я делал подобную фигню, но она не работает в aot :) Через reflect-metadata можно переопределить типы в конструкторе, например, найти MyService и заменить на MyNewService
На сколько я понял, reflect-metadata сейчас deprecated, там используют сейчас makeDecorator
Обсуждают сегодня