В настоящее время я изучаю новую платформу Angular и пытаюсь создать панель динамического поиска, которая принимает имя службы в качестве аргумента, чтобы она могла динамически разрешать службу для запроса к бэкэнд-службе.
Для этого я использую Injector
и загружаю сервис во время ngOnInit
.Это прекрасно работает при использовании провайдера на основе строк, однако моя IDE отмечает, что он устарел, и я должен использовать InjectionToken
, который, как мне кажется, не может обернуться.
Я ожидал, что следующий код будет работать, как удаление всех экземпляров InjectionToken
и замена их строковыми литералами прямой строки:
Я попытался просмотреть следующую документацию, но не совсем понял ее, так как чувствую, что сделал именно то, что онговорит, но он продолжает говорить мне, что это не работает: https://angular.io/guide/dependency-injection-providers
Может кто-нибудь сказать мне, что я делаю неправильно?
Спасибо
Объявление модуля
// app.module.ts
@NgModule({
declarations: [
AppComponent,
SearchBarComponent
],
imports: [
BrowserModule,
HttpClientModule,
AppRoutingModule
],
providers: [
{
provide: new InjectionToken<ISearchable>('CustomerService'), // <-- doesn't work; 'CustomerService' <-- works
useValue: CustomerService
}
],
bootstrap: [AppComponent]
})
export class AppModule { }
Компонент панели поиска:
// search-bar.component.ts
@Component({
selector: 'search-bar',
templateUrl: './search-bar.component.html',
styleUrls: ['./search-bar.component.sass']
})
export class SearchBarComponent implements OnInit {
@Input()
source: string;
private searcher: ISearchable;
constructor(private injector: Injector) {}
ngOnInit() {
// error: Error: No provider for InjectionToken CustomerService!
let token = new InjectionToken<ISearchable>(this.source);
this.searcher = this.injector.get<ISearchable>(token);
// this works, but it's deprecated and will probably break in the future
// this.searcher = this.injector.get(this.source);
console.log(this.searcher);
}
}
Использование панели поиска:
<!-- app.component.html -->
<div class="row justify-content-center mb-2">
<div class="col-8">
<search-bar title="Customers" source="CustomerService"></search-bar>
</div>
</div>
Редактировать: Вот пример с ошибкой:
https://stackblitz.com/edit/angular-3admbe