【问题标题】:Angular2 - Error: Can't resolve all parameters for IconServiceAngular2 - 错误:无法解析 IconService 的所有参数
【发布时间】:2017-07-14 11:43:37
【问题描述】:

我一直在尝试将我的应用程序切换到 AoT 编译,并且在加载应用程序时在生产环境中遇到此错误(它在本地工作正常)。

Error: Can't resolve all parameters for IconService: (?, ?)

似乎错误来自提供 IconService 的模块。图标服务构造函数看起来像

constructor(private http:Http, private iconConfiguror:IconConfiguror) {

所以我的问题是这个错误是什么意思,为什么它只会在 prod 环境中发生(我已经尝试在本地启用 prod 模式)?

这似乎意味着没有提供http和图标配置参数,但图标配置是在应用程序模块级别提供的,并且HttpModule被导入到IconModule中,其中提供了IconService .

@NgModule({
    imports: [
        CommonModule,
        HttpModule,
    ],
    declarations: [
        IconComponent,
    ],
    exports: [
        IconComponent,
    ],
    providers: [
        IconService,
        __platform_browser_private__.BROWSER_SANITIZATION_PROVIDERS,
    ],
})

还有我们图标组件的桶。

export * from "./components/icon/icon.configuror";

export * from "./components/icon/icon.service.provider";

export * from "./components/icon/icon.service";

export * from "./components/icon/icon.component";

export * from "./components/icon/icon.module";

【问题讨论】:

  • constructor(private http:Http, private iconConfiguror:IconConfiguror)
  • @AJT_82 忘记更新了,我也试过了。
  • __decorate 是正确的,它们不应该被注入那里。您如何提供IconConfiguror 服务?
  • @altschuler 在 app.module {provide: IconConfiguror, useClass: IconConfigurorImpl}, 中。而 IconConfigurorImpl 本身 @Injectable() export class IconConfigurorImpl extends IconConfiguror {
  • 你在用桶吗?

标签: angular typescript


【解决方案1】:

我的问题是我从一个基类继承,并且我用@Injectable 修饰了那个基类。继承类是应该具有@Injectable 属性的类,而不是基类。似乎当编译器看到 @Injectable 属性时,它会检查以确保可以注入构造函数中的所有属性。如果不是,那就是错误。我通过从该类中删除 @Injectable 属性来解决它。

【讨论】:

    【解决方案2】:

    当我在 app.module.ts 中导入服务时使用以下功能时为我工作

    {provide: AuthService,
        depends: HttpClientModule}
    

    【讨论】:

      【解决方案3】:

      此错误的一个可能原因是您没有使用@Injectable() 装饰您的IconService 类。如果这是原因,在类声明上方添加装饰将修复错误。

      【讨论】:

        【解决方案4】:

        有时只有一种方法可以修复它 - 手动描述参数。

        static get parameters() { return [Http, IconConfiguror] }
        
        constructor(private http:Http, private iconConfiguror:IconConfiguror) {
        

        【讨论】:

          【解决方案5】:

          我也遇到过类似的问题。我通过更改桶中的出口顺序解决了它。

          基本服务文件:

          // dependency.service.ts
          @Injectable()
          export class DependencyService { }
          
          // dependant.service.ts
          import { DependencyService } from '.';
          
          @Injectable()
          export class DependantService {
              constructor(private dependency: DependencyService) { }
          }
          

          跟随桶导致错误:

          // index.ts
          export * from './dependant.service';
          export * from './dependency.service';
          

          虽然以下一项有效:

          // index.ts
          export * from './dependency.service';
          export * from './dependant.service';
          

          【讨论】:

          • 我刚遇到这个问题,不知道你知道为什么会这样吗?
          • @JacquesCornat 我没有对此进行调查。至少我认为依赖顺序必须正确是合乎逻辑的。但是,我怀疑装饰器是如何处理的。
          【解决方案6】:

          通过以不同方式提供 IconService 来解决此问题。

              {
                  provide: IconService,
                  useFactory: iconServiceFactory,
                  deps: [Http, IconConfiguror],
              },
          

          还有工厂本身

          export function iconServiceFactory(http: Http, iconConfiguror: IconConfiguror) {
              return new IconService(http, iconConfiguror);
          }
          

          我猜由于某种原因没有提供 Http(即使导入了 HttpModule),所以我不得不将其声明为依赖项。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-25
            • 2017-01-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多