Угловой интерфейс для службы в селекторе HTML

Как обеспечить внедрение зависимостей через селектор HTML? Следующий ответ через машинопись.

https://stackoverflow.com/a/40068594/14432516

providers: [
  { provide: ISearchService, useValue: SearchInFemaleEmployeeService}
]

Я хочу сделать что-то подобное в html от Parent и использовать службу поиска сотрудников мужского и женского пола. Родительский компонент имеет этот html.

<app-search-component>
</app-search-component>

Я читал, что это можно сделать через модуль? Тем не менее, этот модуль много раз вызывает компонент поиска в html и может потребовать службы поиска сотрудников мужского или женского пола.


person Community    schedule 25.10.2020    source источник


Ответы (1)


Как правило, внедрение зависимостей — это статический процесс. Если вы хотите, чтобы все оставалось статичным, вы можете иметь два компонента <app-search-female-component> и <app-search-male-component>, объявленные следующим образом.

// <app-search-female-component>
constructor(
    private searchService:SearchInFemaleEmployeeService
) {}

// <app-search-male-component>
constructor(
    private searchService:SearchInMaleEmployeeService
) {}

Или объявите один поисковый компонент с параметром, указывающим тип службы, которую вы хотите использовать.

// <app-search-component type="male">
@Input()
public type: string;
constructor(
    private maleSearchService:SearchInFemaleEmployeeService,
    private femaleSearchService:SearchInMaleEmployeeService,
) {}

Есть много способов добиться желаемого. Я бы предпочел второй, потому что мы размещаем выбор службы внутри компонента. Я имею в виду, что в какой-то момент вам придется указать программно и динамически, какой тип поиска вы хотите выбрать, и хорошо, если он где-то изолирован. Чем меньше переключений, тем лучше :)


Изменить: я понимаю, что здесь у вас будет 20-30 служб, поэтому вы не хотите вводить 20-30 служб в свой поисковый компонент. Затем вы можете создать службу SelectorService, используемую для выбора используемой службы поиска. При этом внедрение 20-30 сервисов выполняется только один раз, в SelectorService и ваш компонент внедряет только один сервис.

// SelectorService
constructor(
    private maleSearchService:SearchInFemaleEmployeeService,
    private femaleSearchService:SearchInMaleEmployeeService,
    ...
) {}

selectSearchService(type: string): ISearchService {
    switch (type) {
    ....
    }
}

// <app-search-component type="male">
@Input()
public type: string;
constructor(
    private selector:SelectorService,
) {}
person Célian Garcia    schedule 25.10.2020
comment
ну не уверен, что это сработает, потому что в будущем у меня может быть 20-30 типов, я привел только простой пример - person ; 25.10.2020
comment
хорошо ! А 20-30 уживутся в родителях? Мне интересно, почему собирается инжекторная модель. Почему бы не иметь одну службу, динамически генерирующую конечную точку поиска на основе параметров? - person Célian Garcia; 25.10.2020
comment
они, вероятно, будут использоваться во многих различных компонентах, необходимых для интернет-магазина и т. д. - person ; 25.10.2020
comment
Я попытался отредактировать свой ответ. Это лучше соответствует вашим потребностям? - person Célian Garcia; 25.10.2020