【问题标题】:Angular 4.x - function calls are not supported. Consider replacing the function or lambda with a reference to an exported functionAngular 4.x - 不支持函数调用。考虑将函数或 lambda 替换为对导出函数的引用
【发布时间】:2017-09-29 20:11:07
【问题描述】:

我正在尝试通过使用静态 forRoot() 来提供一种自定义服务的方法,但是...

我收到以下错误 - 即使我已导出 menuServiceFactory 函数以用作工厂。
我也尝试将其导出为 const 值。

错误中的错误:静态解析符号值时遇到错误。调用函数“MenuModule”,不支持函数调用。考虑将函数或 lambda 替换为对导出函数的引用,解析符号 AppModule in ...

相关代码-

import { NgModule, ModuleWithProviders, SkipSelf, Optional } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MenuComponent } from './menu.component';
import { MenuService } from './menu.service';
import { MdMenuModule, MdToolbarModule, MdButtonModule } from '@angular/material';
import { FlexLayoutModule } from '@angular/flex-layout';
import { SecurityModule, SecurityService } from '@savantly/ngx-security';

@NgModule({
  imports: [
    CommonModule,
    MdMenuModule, MdToolbarModule, MdButtonModule, FlexLayoutModule, SecurityModule
  ],
  exports: [
    CommonModule,
    MdMenuModule, MdToolbarModule, MdButtonModule, FlexLayoutModule,
    SecurityModule,
    MenuComponent],
  declarations: [MenuComponent],
  providers: []
})
export class MenuModule {

  static forRoot(options?: any): ModuleWithProviders {
    if (options && options.securityService) {
      return {
        ngModule: MenuModule,
        providers: [{
            provide: MenuService,
            useFactory: menuServiceFactory,
            deps: [options.securityService]
          }]
      }
    } else {
      return {
        ngModule: MenuModule,
        providers: [MenuService]
      };
    }
  }

  constructor (@Optional() @SkipSelf() parentModule: MenuModule) {
    if (parentModule) {
      throw new Error(
        'MenuModule is already loaded. Import it in the AppModule only');
    }
  }
 }

export function menuServiceFactory(_securityService: SecurityService): MenuService {
  return new MenuService(_securityService);
}

【问题讨论】:

  • 尝试删除if else声明
  • 感谢@yurzui - 它确实摆脱了静态分析错误。现在我需要弄清楚如何使这个条件......
  • { provide: someToken, useValue: options }, { provide: MenuService, useFactory: menuService, deps: [someToken] }
  • 行得通,谢谢!

标签: angular typescript angular-factory


【解决方案1】:

在@yurzui 的帮助下——这是重构的模块——

import { NgModule, ModuleWithProviders, SkipSelf, Optional } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MenuComponent } from './menu.component';
import { MenuService } from './menu.service';
import { MdMenuModule, MdToolbarModule, MdButtonModule } from '@angular/material';
import { FlexLayoutModule } from '@angular/flex-layout';
import { SecurityModule, SecurityService } from '@savantly/ngx-security';

@NgModule({
  imports: [
    CommonModule,
    MdMenuModule, MdToolbarModule, MdButtonModule, FlexLayoutModule, SecurityModule
  ],
  exports: [
    CommonModule,
    MdMenuModule, MdToolbarModule, MdButtonModule, FlexLayoutModule,
    SecurityModule,
    MenuComponent],
  declarations: [MenuComponent],
  providers: []
})
export class MenuModule {

  static forRoot({securityService = SecurityService}: {securityService?: SecurityService} = {}): ModuleWithProviders {
     return {
        ngModule: MenuModule,
        providers: [{
            provide: MenuService,
            useFactory: menuServiceFactory,
            deps: [securityService]
          }]
      };
  }

  constructor (@Optional() @SkipSelf() parentModule: MenuModule) {
    if (parentModule) {
      throw new Error(
        'MenuModule is already loaded. Import it in the AppModule only');
    }
  }
 }

export function menuServiceFactory(_securityService: SecurityService): MenuService {
  return new MenuService(_securityService);
}

【讨论】:

  • 嗨,你能解释一下 forRoot 参数吗?
猜你喜欢
  • 1970-01-01
  • 2017-12-01
  • 2017-06-10
  • 2017-08-27
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 2018-03-28
  • 2017-04-26
相关资源
最近更新 更多