У меня есть настраиваемый угловой модуль, который имеет конфигурацию, предоставленную в методе 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, заданным отдельно, даже еслидиректива и компонент используются в одном внешнем компоненте.