Угловая конфигурация модуля переопределения для каждого компонента - PullRequest
0 голосов
/ 10 октября 2019

У меня есть настраиваемый угловой модуль, который имеет конфигурацию, предоставленную в методе forRoot(), благодаря одноэлементному сервису. Этот модуль предоставляет директиву и компонент для рендеринга функциональных возможностей модуля (что-то вроде проводника файлов в диалоге) внешне для самого модуля.

Служба конфигурации выглядит примерно так:

@Injectable()
export class FileManagerConfigService {

    config: IFileManagerConfig;
    private moduleConfiguration: IFileManagerConfig;

    constructor(moduleConfiguration?: IFileManagerConfig) {
        this.moduleConfiguration = { ...DEFAULT_FILE_MANAGER_CONFIG, ...moduleConfiguration };
        this.config = { ...DEFAULT_FILE_MANAGER_CONFIG, ...moduleConfiguration };
    }

    /**
     * Override the module configuration with a new one
     * @param adHocConfiguration new plugin configuration
     */
    mergeConfig(adHocConfiguration: Partial<IFileManagerConfig>) {
        this.config = { ...DEFAULT_FILE_MANAGER_CONFIG, ...this.moduleConfiguration, ...adHocConfiguration };
    }

    /**
     * returns the current configuration
     */
    getConfig(): IFileManagerConfig {
        return this.config;
    }

    /**
     * Restore the plugin configuration to the module one.
     */
    setDefault() {
        this.config = this.moduleConfiguration;
    }

}

В модуле это выглядит так:

public static forRoot(config?: Partial<IFileManagerConfig>): ModuleWithProviders {
const configurationServiceInstance = new FileManagerConfigService(moduleConfiguration);
// injecting configuration for the service!
return {
  ngModule: FileManagerModule,
  providers: [
    FileManagerModalService,
    FileManagerService,
    {
      provide: FileManagerConfigService,
      useValue: configurationServiceInstance
    }
  ]
};

Мне было интересно, есть ли способ, и это хорошая практика, или я должен изменить весь подход, чтобыпереопределите конфигурацию службы с помощью декоратора @Input () отдельно в компоненте и директивы, поддерживающей глобальную службу конфигурации, которая предоставляет мне текущую конфигурацию, чтобы я мог использовать ее в другой службе в модуле (избегая иметь единый экземпляр для всехмодуль). Таким образом, в компоненте или директиве я могу сделать что-то вроде этого:

  @Input() fileManagerOptions: Partial<IFileManagerConfig>;
  ngAfterViewInit() {
      if (this.fileManagerOptions) {
      // merge della configurazione con la configurazione data
      this.fmConfigService.mergeConfig(this.fileManagerOptions);
   } else {
       this.fmConfigService.setDefault();
    }
  }

Поэтому, когда я получаю this.fmConfigService, я уверен, что у меня есть конфигурация, объединенная с @Input, заданным отдельно, даже еслидиректива и компонент используются в одном внешнем компоненте.

...