169 похожих чатов

Как избавиться от проброса 100500 DI-зависимостей в абстрактный компонент? Например, есть

цепочка абстрактных компонентов, каждый из которых наследуется один за другим, и в итоге каждому всё больше нужно пробрасывать зависимости в super(). В итоге не-абстрактный потомок пробрасывает десяток сервисов в super(). Как этого избежать?

Есть статья, но там нормального ответа не дается.

31 ответов

16 просмотров

Никак, это порочная проблема иерархии классов. Попробуйте композицию функционала вместо наследования

Kenya-West-️ Автор вопроса
Пёß Цифроwого Сопротивlения
Никак, это порочная проблема иерархии классов. Поп...

А как через композицию расширить список методов класса?

Kenya-West-️ Автор вопроса
Пёß Цифроwого Сопротивlения
Никак, это порочная проблема иерархии классов. Поп...

Не то, чтобы нет способов, конечно... Нет нормальных способов. Есть ненормальный вариант юзать внутреннее API Angular'а с долбанутыми префиксами типа import privateShit from ΘΘ_PrivateShitDonotFuckingUse_ΘΘ, но меня будут за такое по рукам бить

Kenya-West ️
Не то, чтобы нет способов, конечно... Нет нормальн...

А как приватный импорт решит проблему что в конструкторе потомка нужны сервисы?

че там за компоненты у вас такие, что надо наследовать

100500 сервисов уже звучит как проблема, да еще и внутри абстрактного класса, еще и в компоненте

Kenya-West-️ Автор вопроса
Пёß Цифроwого Сопротивlения
А как приватный импорт решит проблему что в констр...

Изи решает через setCurrentInjector: import { ɵsetCurrentInjector as setCurrentInjector } from "@angular/core"; export abstract class AbstractFormControlMaterialComponent<T = any> extends AbstractFormControlComponent<T> implements MatFormFieldControl<T> { public ngControl: NgControl; private elementRef: ElementRef; private formBuilder: FormBuilder; constructor(injector: Injector) { super(injector); try { const former = setCurrentInjector(injector); // получаем экзмепляр инжектора const focusMonitor = inject(FocusMonitor); this.elementRef = inject(ElementRef); this.formBuilder = inject(FormBuilder); this.ngControl = inject(NgControl); setCurrentInjector(former); // сеттим инжектор } catch (error) { console.error(error); } } }

Kenya-West ️
Изи решает через setCurrentInjector: import { ɵse...

а зачем приватный апи для этого, можно просто текущий инжектор взять

Kenya-West-️ Автор вопроса
Denis Makarov
100500 сервисов уже звучит как проблема, да еще и ...

Ну, я хочу в отдельном абстрактном компоненте заимплементить ControlValueAccessor, в следующем абстрактном потомке MatFormFieldControl<T>, в другом абстрактном потомке свои абстрактные методы запилить... … и весь этот получившийся суп я хочу в потомке использовать без проброса 100500 зависимостей от сервисов. С формами - получилось (5 абстрактных компонентов над любой формой), но с контролами не очень

Kenya-West-️ Автор вопроса
Denis Makarov
100500 сервисов уже звучит как проблема, да еще и ...

Ну, типа это разделение кода по назначению. Прикольно же

Kenya-West ️
Ну, типа это разделение кода по назначению. Прикол...

И потом когда надо что-то будет исправить будет очень весело все 5 классов править

Kenya-West-️ Автор вопроса
Пёß Цифроwого Сопротивlения
И потом когда надо что-то будет исправить будет оч...

Да ну, там же Ангуляр сразу же ошибку выдаст, связанную с конкретным абстрактные классом. Оно уже в проде работает и норм

Kenya-West ️
Да ну, там же Ангуляр сразу же ошибку выдаст, связ...

Я про то что изменения придётся вносить в худшем случае в _пять классов_

Kenya-West-️ Автор вопроса
Пёß Цифроwого Сопротивlения
Я про то что изменения придётся вносить в худшем с...

Да, ты прав. В случае, если родителю внезапно понадобилась ещё одна зависимость

Denis Makarov
разделение в наследовании?

Сделать новый компонент, наследуемый от существующего?

Kenya-West ️
Ну, я хочу в отдельном абстрактном компоненте заим...

в доке не уделяют внимание небольшой особенности, интерфейс cva не обязательно компонент должен реализовывать, а любой класс, который заинжектят под цва токеном. Все его методы можно из класса компонента вынести

Kenya-West-️ Автор вопроса
xxtux Shvets
в доке не уделяют внимание небольшой особенности, ...

ОК, и в итоге всё равно же через наследование надо пробрасывать реализованные методы?

Kenya-West-️ Автор вопроса
Kenya-West ️
ОК, и в итоге всё равно же через наследование надо...

Тогда, по сути, то же самое, что у меня сейчас

Kenya-West-️ Автор вопроса
xxtux Shvets
зачем о.о

Не, а как еще-то. Только implements/extends...

Kenya-West-️ Автор вопроса
xxtux Shvets
зачем о.о

Я джуниор с шестилетним стажем, объясните как тупому

Не наследовать компоненты для наследования логики, а использовать делегирование, или использовать композицию компонентов с помощью директив или других компонентов

Hey 👋, i'm 𝖙𝖍𝖊𝖐𝖎𝖇𝖆! キバ
Не наследовать компоненты для наследования логики,...

если нужно получить логику то выносите её в класс и на следуйте его или инжектите. вот выше тоже самое предлагается.

Евгений Гений
если нужно получить логику то выносите её в класс ...

первые два блока с кодом в RxJs. в 1 вы в переменную записываете Observable а во втором Subscription с учетом того что нейминг переменной подразумевает все таки Observable

Viktor Govorin
а если мне нужны хуки?

хуки не наследуется, вот тут написано. если нужны хуки нужно думать как обойти. описываете ситуацию. https://medium.com/@saniyusuf/part-1-the-case-for-component-inheritance-in-angular-a34fe2a0f7ac

Viktor Govorin
а если мне нужны хуки?

Расскажите кейс Мы в свое время наследование компонентов использовали, замучались выпиливать потом

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта