Конфигурируемый angular 9 модуль - PullRequest
0 голосов
/ 15 марта 2020

Я хочу создать настраиваемый модуль Angular 9 с включенным IVY и AOT.

IVY и AOT по умолчанию включены в текущей версии Angular:

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

В простейшем сценарии он должен предоставлять одну службу с сохранением состояния, настраиваемую по имени:

counter.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();
  }

}

На этом этапе все работает отлично. Но если я хочу добавить какие-либо логи c в CounterModule.withConfig:

counter.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]

Что я могу с этим сделать? Исправить это как-нибудь? Может быть, есть другой подход к созданию настраиваемых модулей?

1 Ответ

0 голосов
/ 03 апреля 2020

В настоящее время есть ограничение, что в функции есть только один оператор. Поэтому, если вы хотите добавить к нему какую-либо логику c и сохранить работу 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
    }]
  }
}
...