Been trying to implement a genetic resolver in my app for a while now. My first implementation based on my intuition gave me the exact result as this SO question: How to provide a service that uses generics in Angular4?, which of-course also gave me the exact error.
I tried solving it using the excepted answer (using InjectionToken
) but could not get it to work, perhaps I'm not proficient enough in using InjectionToken
, my current code:
GenericResolverService
`export interface GetItem<T> {
getItem(id: number): Observable<T>;
}
@Injectable()
export class GenericResolverService<T, U extends GetItem<T>>
implements Resolve<T> {
constructor(private dataService: U,
private router: Router) {
}
resolve(route: ActivatedRouteSnapshot,
stata: RouterStateSnapshot):
Observable<T> | Observable<never> {
const itemId = +route.paramMap.get('id');
return this.dataService.getItem(itemId).pipe(
take(1),
mergeMap(item => {
if (item) {
return of(item);
} else {
this.router.navigate(['/error/not-found']);
return EMPTY;
}
})
);
}
}`
Router module
const ITEM_RESOLVER =
new InjectionToken<GenericResolverService<ItemMasterData, ItemMasterDataService>>
('itemResolver');
const routes: Routes = [
{
path: ':id', component: ItemMasterDataEditComponent,
resolve: {
item: ITEM_RESOLVER
}
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
providers: [{ provide: ITEM_RESOLVER, useClass: GenericResolverService}]
})
export class ItemMasterDataRoutingModule { }
ItemMasterDataService
@Injectable()
export class ItemMasterDataService implements GetItem<ItemMasterData> {
public getItem(id: number): Observable<ItemMasterData> {
...
}
The current code throws error:
Error: Can't resolve all parameters for GenericResolverService: (?, [object Object]).
What am I doing wrong?