在子状态下注入解决方案

时间:2016-12-17 15:32:51

标签: angular angular-ui-router

我试图将api注入儿童状态。我的州定义如下所示。

澄清一点。 " API"应该是名为" root"的摘要中解析的值。我想在名为" root.some2"。

的子状态中使用该值
{
  name: 'root',
  abstract: true,
  resolve: {
    provide: 'api',
    useFactory: (http) => http
      .get(AppRoute.apiUrl)
      .map((response: Response) => response.json())
      .toPromise(),
    deps: [Http]
  }
},
{
  name: 'root.some2',
  url: '/some2',
  component: Something2Component,
  resolve: [
    {
      token: 'exercises',
      resolveFn: (http, api) => http
        .get(api._links.exercises.href)
        .map((response: Response) => response.json())
        .toPromise(),
      deps: [Http, 'api']
    }
  ]
}

但是没有找到api。我收到了以下错误。

Error: No provider for api!
at NoProviderError.BaseError [as constructor] (errors.js:24)
at NoProviderError.AbstractProviderError [as constructor] (reflective_errors.js:41)
at new NoProviderError (reflective_errors.js:72)
at ReflectiveInjector_._throwOrNull (reflective_injector.js:758)
at ReflectiveInjector_._getByKeyDefault (reflective_injector.js:786)
at ReflectiveInjector_._getByKey (reflective_injector.js:749)
at ReflectiveInjector_.get (reflective_injector.js:558)
at AppModuleInjector.NgModuleInjector.get (ng_module_factory.js:95)
at UIInjectorImpl.getNative (resolveContext.js:178)
at getDependency (resolveContext.js:145)

关于出了什么问题的任何线索?

2 个答案:

答案 0 :(得分:1)

使用以下命令会导致在子状态中定义变量api。

{
  name: 'root',
  abstract: true,
  resolve: {
    api: [Http, (http) => http
      .get(AppRoute.apiUrl)
      .map((response: Response) => response.json())
      .toPromise()]
  }
},
{
  name: 'root.some2',
  url: '/some2',
  component: Something2Component,
  resolve: {
    token: 'exercises',
    resolveFn: (http, api) => http
      .get(api._links.exercises.href)
      .map((response: Response) => response.json())
      .toPromise(),
    deps: [Http, 'api']
  }
}

答案 1 :(得分:0)

如果你需要一个服务,你的解决方法yopu将需要一个函数的解析类insetad。 简单的例子:

@Injectable()
class MyResolver implements Resolve<MyObject> {
    constructor(private backend: Backend) {}

    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any>|Promise<any>|any {
        return WhateverPromiseOrObservableYouNeed;
    }
}

在您的路由器中:

resolve: {
    resolveObject: MyResolver
}
相关问题