I have a resolve that fetches data from an api and a service that depends on that resolve. The service depending on the resolve will be providing sections of data to multiple components and is only expected to be run once when the page loads. Here is the relevant code (imports & some annotations omitted):
product-details.service.ts
@Injectable()
export class ProductDetailsService {
private productDetails: ProductDetails;
constructor(route: ActivatedRoute) {
this.productDetails = route.snapshot.data['product'];
}
public getProductDetails(): ProductDetails {
return this.productDetails;
}
}
product-details.resolve.ts
@Injectable()
export class ProductDetailsResolve implements Resolve<ProductDetails> {
constructor(private httpService: HttpService) { }
resolve(route: ActivatedRouteSnapshot): Observable<ProductDetails> {
return this.httpService.getProductDetails(route.params['id']);
}
}
app-routing.module.ts
const routes: Routes = [
{ path: 'main/:id', component: MainComponent, resolve: { product: ProductDetailsService } },
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
some.component.ts
export class SomeComponent {
public value: number = 0;
constructor(private productDetailsService: ProductDetailsService) {
this.value = productDetailsService.getProductDetails().value;
}
}
When I run the app, I get this error:
core.es5.js:1020 ERROR Error: Uncaught (in promise): TypeError: resolver is not a function
TypeError: resolver is not a function
at PreActivation.webpackJsonp.../../../router/@angular/router.es5.js.PreActivation.getResolver (router.es5.js:4559)
at PreActivation.webpackJsonp.../../../router/@angular/router.es5.js.PreActivation.resolveNode (router.es5.js:4537)
at PreActivation.webpackJsonp.../../../router/@angular/router.es5.js.PreActivation.runResolve (router.es5.js:4518)
at MergeMapSubscriber.project (router.es5.js:4285)
at MergeMapSubscriber.webpackJsonp.../../../../rxjs/operator/mergeMap.js.MergeMapSubscriber._tryNext (mergeMap.js:120)
at MergeMapSubscriber.webpackJsonp.../../../../rxjs/operator/mergeMap.js.MergeMapSubscriber._next (mergeMap.js:110)
at MergeMapSubscriber.webpackJsonp.../../../../rxjs/Subscriber.js.Subscriber.next (Subscriber.js:89)
at ArrayObservable.webpackJsonp.../../../../rxjs/observable/ArrayObservable.js.ArrayObservable._subscribe (ArrayObservable.js:114)
at ArrayObservable.webpackJsonp.../../../../rxjs/Observable.js.Observable._trySubscribe (Observable.js:171)
at ArrayObservable.webpackJsonp.../../../../rxjs/Observable.js.Observable.subscribe (Observable.js:159)
at PreActivation.webpackJsonp.../../../router/@angular/router.es5.js.PreActivation.getResolver (router.es5.js:4559)
at PreActivation.webpackJsonp.../../../router/@angular/router.es5.js.PreActivation.resolveNode (router.es5.js:4537)
at PreActivation.webpackJsonp.../../../router/@angular/router.es5.js.PreActivation.runResolve (router.es5.js:4518)
at MergeMapSubscriber.project (router.es5.js:4285)
at MergeMapSubscriber.webpackJsonp.../../../../rxjs/operator/mergeMap.js.MergeMapSubscriber._tryNext (mergeMap.js:120)
at MergeMapSubscriber.webpackJsonp.../../../../rxjs/operator/mergeMap.js.MergeMapSubscriber._next (mergeMap.js:110)
at MergeMapSubscriber.webpackJsonp.../../../../rxjs/Subscriber.js.Subscriber.next (Subscriber.js:89)
at ArrayObservable.webpackJsonp.../../../../rxjs/observable/ArrayObservable.js.ArrayObservable._subscribe (ArrayObservable.js:114)
at ArrayObservable.webpackJsonp.../../../../rxjs/Observable.js.Observable._trySubscribe (Observable.js:171)
at ArrayObservable.webpackJsonp.../../../../rxjs/Observable.js.Observable.subscribe (Observable.js:159)
at resolvePromise (zone.js:795)
at resolvePromise (zone.js:766)
at zone.js:844
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:425)
at Object.onInvokeTask (core.es5.js:3881)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:424)
at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.runTask (zone.js:192)
at drainMicroTaskQueue (zone.js:602)
at <anonymous>
Research into this error has not given me any clues, and I can't think of any reason why the resolve is not being acknowledged as a function. Is there something that I am missing here?
I got this error when I accidentally passed a Guard
as a resolver in my route config:
resolve: { data: MyGuardService }
So check that you haven't accidentally passed the wrong class. For example, if you want a canActivate
guard, the code would look like this instead:
canActivate: [ MyGuardService ]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With