В вас app.module
вы можете использовать строку:
@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent, HelloComponent ],
bootstrap: [ AppComponent ],
providers: [
MyPipe,
{ provide: 'myPipe', useClass: MyPipe }
]
})
export class AppModule { }
Затем вы можете вставить ее в свой компонент:
import { Component, Injector } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
name = 'Angular';
constructor(private injector:Injector){
var myInterface = injector.get('myPipe');
myInterface.transform('test');
}
}
Вот стек стека показывая пример
РЕДАКТИРОВАТЬ
Если вы хотите избежать устаревшего вызова на injector.get
, но все еще сможете получить доступ к службе из инжектора со строкой,Вы можете использовать сервис, чтобы выяснить, какой токен инъекции следует использовать.Я не думаю, что это самый красивый способ сделать это, но я думаю, что он отвечает потребностям OP.
Сначала создайте службу, чтобы сопоставить строку с ожидаемым токеном инъекции:
@Injectable()
export class TokenService {
static MY_PIPE_TOKEN = new InjectionToken<MyPipe>('myPipe');
getToken(name: string): InjectionToken<any> {
if (name === 'myPipe') {
return TokenService.MY_PIPE_TOKEN;
} else {
throw `No token with name ${name} found`;
}
}
}
Настройте своих провайдеров, используя токен инъекции из службы:
@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent, HelloComponent ],
bootstrap: [ AppComponent ],
providers: [
TokenService,
MyPipe,
{ provide: TokenService.MY_PIPE_TOKEN, useClass: MyPipe }
]
})
export class AppModule { }
В компоненте используйте службу, чтобы получить правильный токен:
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
name = 'Angular';
constructor(private injector:Injector, private tokenService: TokenService){
let myInterface = injector.get(tokenService.getToken('myPipe'));
myInterface.transform('test');
}
}
Вот astackblitz , показывающий обновленный пример.