У меня есть модуль с отложенной загрузкой с ngrx / store для функции StoreModule.forFeature('tasks', tasksReducer). Мне нужно установить для него начальное состояние, но значения, которые мне нужно установить, требуют внедрения зависимости для их получения (эти значения выбираются из другого хранилища функций в службе). Я читал, что для этой цели можно использовать токен инъекции INITIAL_STATE. Я пробовал следующее:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SharedModule } from '@realiecho/shared/shared.module';
import { tasksRoutes } from './tasks.routing';
import { TasksComponent } from './tasks/tasks.component';
import { INITIAL_STATE, StoreModule } from '@ngrx/store';
import { tasksReducer } from '@realiecho/main/tasks/store/tasks.reducer';
import { TasksEffects } from '@realiecho/main/tasks/store/tasks.effects';
import { TasksTableViewComponent } from '@realiecho/main/tasks/tasks/tasks-table-view/tasks-table-view.component';
import { EffectsModule } from '@ngrx/effects';

import { InitialStateService } from '@reali/web-core';

export const TASK_EFFECTS = [
    TasksEffects
];

@NgModule({
    imports: [
        CommonModule,
        tasksRoutes,
        SharedModule,
        EffectsModule.forFeature(TASK_EFFECTS),
        StoreModule.forFeature('tasks', tasksReducer),
    ],
    declarations: [
        TasksComponent,
        TasksTableViewComponent
    ],
    providers: [
        {
            provide: INITIAL_STATE,
            useFactory: getInitialState,
            deps: [InitialStateService]
        }
    ]
})
export class TasksModule {
}


export function getInitialState(initService: InitialStateService) {

     return initService.getInitState();

}

Но когда я запускаю его, начальное состояние равно undefined независимо от того, что я возвращаю в initService.getInitState(), даже если я возвращаю жестко запрограммированную константу.

2
Olga Ievtukhova 13 Ноя 2019 в 14:38

2 ответа

    import { inject } from '@angular/core';  

    export function getInitialState() {
     return inject(InitService).getInitState();
    }

Ты можешь попробовать что-нибудь подобное? или

export class TasksModule {
static forRoot(): ModuleWithProviders {
    return {
      ngModule: TasksModule ,
    providers: [
        {
            provide: INITIAL_STATE,
            useFactory: getInitialState,
            deps: [InitialStateService]
        }
    ]
    }
  }

Затем для appModule

@NgModule({
        imports: [
            ...
           TaskModule.forRoot(),
          ...
        ],

    })
export class AppModule {
}
0
Eldar 13 Ноя 2019 в 22:50
Это не помогает. Проблема в том, что getInitialState () вообще не выполняется. Должен ли я передать токен INITIAL_STATE где-нибудь еще, кроме providers?
 – 
Olga Ievtukhova
13 Ноя 2019 в 18:57
Этот модуль задачи загружается лениво?
 – 
Eldar
13 Ноя 2019 в 19:00

Думаю, вам нужно следующее: StoreModule.forFeature ('tasks', tasksReducer, INITIAL_STATE)

Хотя сейчас я борюсь с тем, как сбросить начальное состояние в редукторе.

Ура

Джеймс

0
jpspringall 20 Ноя 2019 в 22:34
Это не помогло. Я все еще вижу, что функция getInitState() выполняется, но результату не присваивается начальное состояние
 – 
Olga Ievtukhova
1 Дек 2019 в 11:10