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

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

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

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

31 ответов

6 просмотров

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

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
а если мне нужны хуки?

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

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

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

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Заметил в ghci 9.4.8: > :t (<*>) @((->)_) (<*>) @((->)_) :: (w -> (a -> b)) -> (w -> a) -> w -> b Разве не должно (w -> (a -> b)) быть записано как (w -> a -> b)? Это баг, ил...
Михаил
13
Any electron dev here?
Sayanth Tezro
12
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
так это может кто что знает или использует что-то как макбук только не макбук? на 13…14 дюймов
Michael
9
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Кто-нибудь знает почему SPM клонирует репо целиком? Некоторые репы просто огромные, как та же swift-syntax которая нужна для использования макросов. Сначала подумал, что это...
iMike
6
Карта сайта