无法实例化循环依赖! ApplicationRef(“[ERROR - >]”):在./AppModule@-1:-1中的NgModule AppModule中

时间:2017-09-27 06:42:58

标签: angular

  

我已将此代码添加到我的app.module.ts

    providers: [ AppConfigService,
            {
                provide: APP_INITIALIZER,
                useFactory: (config: AppConfigService) => () => config.getAppConfig(),
                deps: [AppConfigService],
                multi: true
            },
]

获取此错误

enter image description here

问题:我已使用ngx-permission pkg获得许可。我设置了route权限方法。但是当我刷新页面时,主页上的时间重定向却停留在当前页面上。所以我尝试to load permissions before application start up method来解决这个问题,但是遇到了这个错误。

 config.getAppConfig() // call when application start up

有任何想法请帮忙。其他解决方案也欢迎。

3 个答案:

答案 0 :(得分:2)

我已经解决了这个解决方案的问题

将功能创建到app.module.ts

export function loadConfig(appService: AppConfigService): Function {
    return () => appService.getAppConfig();
}

 AppConfigService,
        {
            provide: APP_INITIALIZER,
            useFactory: loadConfig,
            deps: [AppConfigService],
            multi: true
        },

issue into `HttpInterceptor` so i used injector for that
constructor(private inj: Injector) {
        super(
            inj.get(XHRBackend),
            inj.get(RequestOptions)
        );
}

答案 1 :(得分:2)

当您的APP_INITIALIZER中的依赖项依赖于Angular服务时,例如,可能会发生此错误。 Router

解决方案是延迟注入,方法是将服务的构造函数更改为接受Injector,然后在构造函数之外解析值。

示例AppConfigService

import { Injectable, Injector } from '@angular/core';
import { Router } from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class AppConfigService {

  // Helper property to resolve the service dependency.
  private get _router() { return this._injector.get(Router); }

  constructor(
    //private _router: Router
    private _injector: Injector
  ) { }

  navigate() {
    this._router.navigate(['/']);
  }
}

答案 2 :(得分:0)

我在动态更新路由时遇到了同样的问题。
实际上,您不必手动注入依赖项。您所要做的就是拆分循环。先解析依赖,再使用。
这是路由器的示例,但您可以设置任何您喜欢的依赖项。

VersionId

配置类:

// AppModule
{
  provide: APP_INITIALIZER,
  useFactory: myFactoryUpdatingRoutes, // init routes from special config
  multi: true,
  deps: [MyRouterLoader],
},