Angular:装饰器中不支持函数表达式

时间:2018-09-07 11:30:44

标签: javascript angular typescript

我有一个遗留代码,到目前为止我还不完全了解,但是必须维护,大声笑))

该代码是按我下面所述编写的组件,它可以与ng serve一起使用,但是可以与ng build --prod一起崩溃。

providers字段的问题:

@Component({
  selector: "legacy-component",
  templateUrl: './legacy-component.component.html',
  styleUrls: ['./legacy-component.scss'],
  //Take a look at "providers", the problem is there
  providers: [provideWidget(LegacyComponent, {
    id: "legacy",
    options: {},
    layout: { minCols: 2, cols: 4, rows: 2 },
    info: {
      name: "Legacy Compoent",
      image: "assets/img/legacy/legacy.png",
      description: ""
    }
  })]
})
export class LegacyComponent {...}

我不太了解提供商在这里发生了什么,但是当我尝试构建项目时,我有:

Error during template compile of 'LegacyComponent'
  Function expressions are not supported in decorators in 'provideWidget'
    'provideWidget' contains the error at some/path/other-class.ts
      Consider changing the function expression into an exported function.

但是,如果我将provideWidget重写为一个函数,则会出现不同的错误:

Error during template compile of 'LegacyComponent'
  Function calls are not supported in decorators but 'provideWidget' was called.

我假设在提供程序中进行函数调用可能不是一个好主意,但我应该启动代码,并且我无法替换由于该函数的逻辑复杂,provideWidget使用了一些静态数据进行调用。

在这种情况下,有人对如何构建生产版本吗?

1 个答案:

答案 0 :(得分:0)

Reference to provider type

在这里您可以看到提供者可以是TypeProvider | ValueProvider | ClassProvider | ConstructorProvider | ExistingProvider | FactoryProvider

因此,如果您需要动态提供程序,则需要使用FactoryProvider

{ provide: 'SomeToken', useFactory: factoryFunction }

另一种方式是,如果ProvideWidget是无状态函数,则可以在类定义之前创建一个常量,并将其分配给const值并用作ValueProvider