gpt4 book ai didi

angular - 可配置的 Angular 9 模块

转载 作者:行者123 更新时间:2023-12-04 10:24:17 25 4
gpt4 key购买 nike

我想创建带有 IVY 和 AOT 的可配置 Angular 9 模块。

IVY and AOT on by default in current version of Angular:

npx @angular/cli@9.0.6 new ng-modules --style=scss --routing=false


在最简单的场景中,它必须提供一个按名称可配置的有状态服务:
计数器.module.ts
@Injectable()
export class CounterService {
private counter = 0;
shot() {
return this.counter++;
}
}

@NgModule()
export class CounterModule {
static withConfig(name: string): ModuleWithProviders {
return {
ngModule: CounterModule,
providers: [{
provide: name,
useClass: CounterService
}]
};
}
}
app.module.ts
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
CounterModule.withConfig('main.CountService'),
CounterModule.withConfig('integration.CountService'),
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
app.component.ts
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
title = 'ng-modules-shots';
constructor(
@Inject('main.CountService') counter: CounterService,
) {
this.title = '' + counter.shot();
}

}
此时一切正常。但是如果我想在 CounterModule.withConfig 中添加任何逻辑:
计数器.module.ts
...
@NgModule()
export class CounterModule {
static withConfig(name?: string): ModuleWithProviders {
const counterProviderToken = name ? name : CounterService;
return {
ngModule: CounterModule,
providers: [{
provide: counterProviderToken,
useClass: CounterService
}]
};
}
}
我收到一个错误:
ERROR in src/app/app.module.ts:11:16 - error NG1010: Value at position 1 in the NgModule.imports of AppModule is not a reference: [object Object]
我能做些什么呢?以某种方式修复它?也许还有另一种制作可配置模块的方法?

最佳答案

当前存在一个约束,即函数中只有一条语句。因此,如果您想为其添加任何逻辑并保持 AOT 正常工作,则应将其放在此语句中。

...
@NgModule()
export class CounterModule {
static withConfig(name?: string): ModuleWithProviders {
return {
ngModule: CounterModule,
providers: [{
provide: name ? name : CounterService,
useClass: CounterService
}]
};
}
}

但是,您可以使用函数在此模块中生成提供程序:
...
@NgModule()
export class CounterModule {
static withConfig(name?: string): ModuleWithProviders {
return {
ngModule: CounterModule,
providers: this.generateProviders(name)
};
}

private static generateProviders(name?: string): Provider[] {
const counterProviderToken = name ? name : CounterService;
return [{
provide: counterProviderToken,
useClass: CounterService
}]
}
}

关于angular - 可配置的 Angular 9 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60692975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com