Angular 角度5:函数调用在decorators中不受支持
我正在从Angular应用程序构建PWA,当我运行Angular 角度5:函数调用在decorators中不受支持,angular,typescript,progressive-web-apps,Angular,Typescript,Progressive Web Apps,我正在从Angular应用程序构建PWA,当我运行ng build--prod时,出现以下错误: ERROR in app\app.module.ts(108,64): Error during template compile of 'AppModule' Function calls are not supported in decorators but 'Environment' was called in 'environment' 'environment' calls 'Enviro
ng build--prod
时,出现以下错误:
ERROR in app\app.module.ts(108,64): Error during template compile of 'AppModule'
Function calls are not supported in decorators but 'Environment' was called in 'environment'
'environment' calls 'Environment'.
但是,这毫无意义,因为我在类中添加了export
,您可以在这里看到:
环境.产品ts
import { BaseEnvironment } from './base-environment';
import { ProspectBuilderModel } from '../app/models/prospect';
export class Environment extends BaseEnvironment {
production: boolean = true;
prospectBuilderModel: ProspectBuilderModel = {
buildQuote: false,
buildAcknowledge: false,
buildOrganizationInfo: false,
buildFinancialInfo: false,
buildTradeInfo: false,
buildPermissiblePurpose: false,
buildUserSetup: false,
buildPackageSelection: false,
buildPaymentOptions: false,
buildOrderOptions: false,
buildVerifyOrganizationInfo: false,
buildDocusignAuthorization: false,
buildDocusignContract: false
};
}
export const environment = new Environment();
import { ProspectBuilderModel } from '../app/models/prospect';
export abstract class BaseEnvironment {
abstract production: boolean;
abstract prospectBuilderModel: ProspectBuilderModel;
}
...
],
imports: [
BrowserModule,
AppRoutingModule,
FormsModule,
MultiselectDropdownModule,
ReactiveFormsModule,
HttpModule,
ToastrModule.forRoot(),
BrowserAnimationsModule,
NgxMyDatePickerModule.forRoot(),
PopoverModule.forRoot(),
ModalModule.forRoot(),
ServiceWorkerModule.register('/ngsw-worker.js', { enabled: environment.production })
],
providers: [
...
基本环境。ts
import { BaseEnvironment } from './base-environment';
import { ProspectBuilderModel } from '../app/models/prospect';
export class Environment extends BaseEnvironment {
production: boolean = true;
prospectBuilderModel: ProspectBuilderModel = {
buildQuote: false,
buildAcknowledge: false,
buildOrganizationInfo: false,
buildFinancialInfo: false,
buildTradeInfo: false,
buildPermissiblePurpose: false,
buildUserSetup: false,
buildPackageSelection: false,
buildPaymentOptions: false,
buildOrderOptions: false,
buildVerifyOrganizationInfo: false,
buildDocusignAuthorization: false,
buildDocusignContract: false
};
}
export const environment = new Environment();
import { ProspectBuilderModel } from '../app/models/prospect';
export abstract class BaseEnvironment {
abstract production: boolean;
abstract prospectBuilderModel: ProspectBuilderModel;
}
...
],
imports: [
BrowserModule,
AppRoutingModule,
FormsModule,
MultiselectDropdownModule,
ReactiveFormsModule,
HttpModule,
ToastrModule.forRoot(),
BrowserAnimationsModule,
NgxMyDatePickerModule.forRoot(),
PopoverModule.forRoot(),
ModalModule.forRoot(),
ServiceWorkerModule.register('/ngsw-worker.js', { enabled: environment.production })
],
providers: [
...
应用程序模块.ts
import { BaseEnvironment } from './base-environment';
import { ProspectBuilderModel } from '../app/models/prospect';
export class Environment extends BaseEnvironment {
production: boolean = true;
prospectBuilderModel: ProspectBuilderModel = {
buildQuote: false,
buildAcknowledge: false,
buildOrganizationInfo: false,
buildFinancialInfo: false,
buildTradeInfo: false,
buildPermissiblePurpose: false,
buildUserSetup: false,
buildPackageSelection: false,
buildPaymentOptions: false,
buildOrderOptions: false,
buildVerifyOrganizationInfo: false,
buildDocusignAuthorization: false,
buildDocusignContract: false
};
}
export const environment = new Environment();
import { ProspectBuilderModel } from '../app/models/prospect';
export abstract class BaseEnvironment {
abstract production: boolean;
abstract prospectBuilderModel: ProspectBuilderModel;
}
...
],
imports: [
BrowserModule,
AppRoutingModule,
FormsModule,
MultiselectDropdownModule,
ReactiveFormsModule,
HttpModule,
ToastrModule.forRoot(),
BrowserAnimationsModule,
NgxMyDatePickerModule.forRoot(),
PopoverModule.forRoot(),
ModalModule.forRoot(),
ServiceWorkerModule.register('/ngsw-worker.js', { enabled: environment.production })
],
providers: [
...
有人知道我能做些什么来解决这个错误吗?我假设在您添加行之前,您的代码正在工作 ServiceWorkerModule.register('/ngsw-worker.js',{enabled:environment.production}) 通常,当我们在app module中访问环境变量时,它通常是指angular cli自动生成的环境文件(基本上是常量,并作为常量导出)。我从来没有尝试过创建类的对象并在app模块中传递它。这可能是导致问题的原因
试着直接在这行中传递一个true,而不是从一个对象中获取它,然后看看这是否有效。下面是我最终提出的解决方案的代码。希望这有助于遇到此类问题的人。本质上,我只是修改了我的环境文件,这样它就不会创建环境类的实例。我猜Angular不喜欢实例化:
export const environment = {
production: true,
prospectBuilderModel: {
buildQuote: false,
buildAcknowledge: false,
buildOrganizationInfo: false,
buildFinancialInfo: false,
buildTradeInfo: false,
buildPermissiblePurpose: false,
buildUserSetup: false,
buildPackageSelection: false,
buildPaymentOptions: false,
buildOrderOptions: false,
buildVerifyOrganizationInfo: false,
buildDocusignAuthorization: false,
buildDocusignContract: false
}
}
有相同的问题,这里有可能的解决方法(如果您没有动态加载的属性): 1.作为你的回答,反对就是了。 但是您会丢失默认属性和有关“要实现”属性的信息 2.使用静态类: 这里您将丢失“to implement”属性,因为抽象静态是,但您有类型和默认值
// default.env.ts
export class BaseEnvironment {
public production: boolean = true;
public specialPropToImpl: boolean = true;
}
// your.env.ts
export class Environment extends BaseEnvironment {
public specialPropToImpl = true;
}
export const environment = Environment;
3.使用默认属性对象、接口和对象分配:
这里有“要实现”的属性、类型和默认值,但实现起来有点难看
// default.env.ts
export interface EnvProperties {
production: boolean;
specialPropToImpl: boolean;
}
export const defaultEnv = {
production: true
};
// your.env.ts
export const environment: EnvProperties = {
...defaultEnv,
specialPropToImpl: true
};
4.只需从环境中增加一个静态变量
简单的解决方案是,保留子类,但每个env文件都必须有它。但由于新环境文件是由旧环境文件的复制粘贴创建的,所以这可以正常工作。根据生产值,您应该手动更改变量值。
不是非常灵活和可维护的解决方案。但很简单
// your.env.ts
export const enablePwa = true
// app.module.ts
import {environment, enablePwa} from 'env.ts'
//...
ServiceWorkerModule.register('/ngsw-worker.js', { enabled: enablePwa })
这个错误源于您试图将函数调用到装饰器中。如果您需要这方面的帮助,请发布调用函数的decorator,而不是随机代码。抱歉,但我不知道我在哪里调用了函数到decorator中。我上面发布的代码就是错误引用的代码。
app.module.ts
中的ServiceWorkerModule
代码行引用了environment.prod.ts
,它正在导入baseEnvironment
类。这就是我发布所有代码的原因。如果您能告诉我缺少的任何信息,我将非常感谢您的帮助。好的,请尝试使用ng build--prod--sm=false构建。这应该仍然会弹出一个错误,但可能不是同一个。它返回了相同的错误。那么,您有任何回购协议,我们可以浏览以查找您的问题吗?因为它不是来自您发布的代码,而且您似乎不愿意发布更多代码。感谢您的回复Arjun,但我只希望它在environment.production==true
时为真。如果我将布尔值硬编码为true,那么即使environment.production==false(当我在dev环境中运行时),它也会尝试注册服务工作者。我将这一行添加到app.module
中,因为Angular文档在处这样说:我的意思是尝试用硬编码的值替换它,以确定错误。如果AoT构建没有失败,那么我们将确定这是罪魁祸首代码。如果这确实是问题,您可能需要考虑传递此变量的其他方式。此外,您创建Env变量的方式与我们通常在角度CLI项目中设置Env变量的方式不同。env文件是在“src/environments”中创建的,可以在angular-cli.json中添加更多的环境。这是您在上面分享的示例中所期望的路径。谢谢Arjun。我刚到办公室,所以我要试一试。嗯。。。它正在使用硬编码的true
。没有错误。那我该怎么办,阿琼?