I want to fetch data before an route/component is instantiated. Therefore I want to use the "Resolver"-Interface from the Angular2-Routing-Module.
Take a look at my code. Its working with a string as the provider name, but throwing errors if I use an OpaqueToken for the provider.
Watch out for the "NOT WORKING"-Comment.
1 My (Child-)Routes (excerpt).
export const routes: Routes = [{
path: 'myPath',
component: MyComponent,
children: [
{
path: ':id',
component: MyComponent,
resolve: {
itemData: 'MyResolver' // WORKING --- wanted to replace with itemData: MyToken
}
}
]
}];
2 Code of my module (excerpt):
export let MyToken: OpaqueToken = new OpaqueToken('my.resolver');
@NgModule({
imports: [
CommonModule,
...
],
declarations: [
MyComponent,
],
providers: [
{
provide: 'MyResolver', // WORKING -- wanted to replace with provide: MyToken
useFactory: (DataService: any) => {
return new MyResolverService(DataService);
},
deps: [MyInstanceOfDataService]
}
]
})
export class MyModule {
}
3 My custom Resolver-Class (excerpt):
@Injectable()
export class MyResolverService implements Resolve<any> {
constructor(protected DataService: any) {
}
resolve(ActivatedRoute: ActivatedRouteSnapshot): Promise<any> {
return this.DataService.getItem(id).toPromise()
.then((response: any}) => {
return response;
});
}
}
Its not possible to replace the string ("myResolver") with the created OpaqueToken ("MyToken" - without quotes of course). Don´t know why. I use multiple OpaqueToken for several Providers, but the Resolver is not able to use it.
The Error message in the console looks like this without further information.
Error: Token must be defined!
Anyone any idea?