javascript - Hvordan bruke Angular-dekoratør for å redusere repetitiv kode?
Jeg har en I18nService som må initialiseres i 90 % av komponentene mine. Prosedyren for å gjøre dette er å importere tjenesten, importere oversettelsesfilen, implementere ngOnInit() og kalle tjenestens init()-funksjon.
Nå prøver jeg å redusere den repetitive koden ved hjelp av klasse-dekoratører. Problemet jeg for øyeblikket står overfor er å bruke min I18nService inne i dekoratøren, siden dekoratører ser ut til å kjøre ved kompileringstid. Jeg prøvde å løse problemet med injektorer og fulgte denne artikkelen: https://netbasal.com/inspiration-for-custom-decorators-in-angular-95aeb87f072c, men fikk AppModule undefined.
Hvordan kan jeg løse problemet? Er dekoratører det riktige valget for å oppnå dette i utgangspunktet?
Svar #1
Du kan lagre Injector i konstruktøren AppModule og deretter bruke den inne i den patchede ngOnInit-metoden for å få tak i en tjeneste registrert i appen din
app.module.ts
@NgModule({
...
providers: [AnalyticsService],
})
export class AppModule {
constructor(private injector: Injector) {
AppModule.injector = injector;
}
static injector: Injector;
}
side-spor.decorator.ts
import { AnalyticsService, AppModule } from './app.module';
export function PageTrack(): ClassDecorator {
return function ( constructor : any ) {
const ngOnInit = constructor.prototype.ngOnInit;
constructor.prototype.ngOnInit = function ( ...args ) {
let service = AppModule.injector.get(AnalyticsService);
service.visit();
ngOnInit && ngOnInit.apply(this, args);
};
}
}
app.component.ts
@Component({
selector: 'my-app',
templateUrl: `./app.component.html`
})
@PageTrack()
export class AppComponent {}
Plunker-eksempel
