Почему не обновляются данные в сервисе?

У меня есть модуль в котором определена фабрика:
providers: [
        CustomBlockService,
        {
            provide: DocumentCustomBlock,
            useFactory: (httpClient: HttpClient, customBlockService: CustomBlockService) => {
                switch (customBlockService.block.type) {
                    case 'doc_num_date_block':
                        return new DocNumDateBlock(
                            httpClient,
                            customBlockService,
                            new DocNumDateBlockFormGroup(createFormControls(customBlockService.value)),
                        );
                    case 'find_unom_by_address_block':
                        return new FindUnomAddressBlock(
                            httpClient,
                            customBlockService,
                            new FindUnomAddressBlockFormGroup(createFormControls(customBlockService.value)),
                        );
                    default:
                        throw 'Error type custom block!';
                }
            },
            deps: [HttpClient, CustomBlockService],
        },
    ],


Этот модуль диалогового окна дергается из родительского компонента, перед открытием окна в сервис CustomBlockService заносится выбранный блок:

public setDocument(): void {
        this.customBlockService.block = this.block;
}


Первый раз это работает, в диалоговом окне я вижу выбранные данные this.customBlockService.block = this.block; в провайдере DocumentCustomBlock.

Когда окно закрывается и повторно открывается с новым this.customBlockService.block = this.block; то я в сервисе вижу старые данные.

Почему в этом случае не обновляется сервис?

Частично понял причину - сервис резолвится один раз и кешируется, вопрос в этом...
  • Вопрос задан
  • 30 просмотров
Решения вопроса 1
zoonman
@zoonman
CEO @ LinuxQuestions.ru
Фабрика создается единожды при вызове механизмов внедрения зависимостей.
То, что вы пытаетесь реализовать, называется поставщиком фабрик.
Вы правильно поняли причину - результат выполнения кэшируется из-за того, что кэшируется инстанциированный сервис.
Вам нужно убирать инстанциирование блоков внутрь сервиса.

Что-то вроде этого:
providers: [
    CustomBlockService,
    {
        provide: DocumentCustomBlock,
        useFactory: (httpClient: HttpClient, customBlockService: CustomBlockService) => {
            return new ControlBlock(httpClient, customBlockService.block.type);
        },
        deps: [HttpClient, CustomBlockService],
    },
],


Но поверьте, вы слишком все усложняете. Советую разбить это дело на компоненты и просто грузить нужный в диалоговое окно. Это сэкономит вам вынос мозга при реализации и упростит поддержку в будущем.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
25 окт. 2020, в 17:09
19999 руб./за проект
25 окт. 2020, в 17:04
3000 руб./за проект
25 окт. 2020, в 16:59
60000 руб./за проект