首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可配置角9模块

可配置角9模块
EN

Stack Overflow用户
提问于 2020-03-15 12:39:56
回答 1查看 717关注 0票数 2

我想要创建可配置的角9模块与常春藤和AOT。

默认情况下,

IVY和AOT在当前版本的角:

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

在最简单的场景中,它必须提供按名称配置的单个有状态服务:

counter.module.ts

代码语言:javascript
复制
@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

代码语言:javascript
复制
@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    CounterModule.withConfig('main.CountService'),
    CounterModule.withConfig('integration.CountService'),
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

app.component.ts

代码语言:javascript
复制
@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中添加任何逻辑:

counter.module.ts

代码语言:javascript
复制
...
@NgModule()
export class CounterModule {
  static withConfig(name?: string): ModuleWithProviders {
    const counterProviderToken = name ? name : CounterService;
    return {
      ngModule: CounterModule,
      providers: [{
        provide: counterProviderToken,
        useClass: CounterService
      }]
    };
  }
}

我收到一个错误:

代码语言:javascript
复制
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]

我能做些什么?不知怎么修好了?也许还有另一种方法来制造可配置的模块呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-03 16:51:50

当前有一个限制,即函数中只有一个语句。因此,如果您想要向它添加任何逻辑并保持AOT工作,那么它应该放在这个语句中。

代码语言:javascript
复制
...
@NgModule()
export class CounterModule {
  static withConfig(name?: string): ModuleWithProviders {
    return {
      ngModule: CounterModule,
      providers: [{
        provide: name ? name : CounterService,
        useClass: CounterService
      }]
    };
  }
}

不过,您可以使用一个函数在此模块中生成提供程序:

代码语言:javascript
复制
...
@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
    }]
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60692975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档