es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo probar los selectores de NGXS

Hola, estoy utilizando la biblioteca de gestión de estado NGXS en mi aplicación y tengo un selector como el siguiente y todo está funcionando bien, pero cuando estoy probando mi aplicación, obtengo el siguiente error. PrintItemsState se ha cargado de forma diferida. Lo que he notado es que estoy pasando PrintItemsState como argumento a continuación.

@Selector([PrintItemsState])

pero no tengo idea de cómo solucionarlo. Agradecería cualquier sugerencia.

Imagen del error

print-items.selectors.ts

@Injectable()
export class PrintItemsSelectors { 
...

@Selector([PrintItemsState])
  static filter(state: PrintItemsStateModel): KeyValue<string, string="">[] {
    const filters = state.fabricPage.page.Filter;
    const filterKeys = Object.keys(state.fabricPage.page.Filter);
    const activeFilters = [];
    filterKeys.forEach((key) => {
      if (filters[key]) {
        activeFilters.push({key: [key], value: filters[key]});
      }
    });
    return activeFilters;
  }

...
}

print-items.module.ts
typescript
@NgModule({
declarations: [
PrintItemsListComponent,
FabricTableComponent,
SummaryTableComponent,
RollCodeDialogComponent,
CommentDialogComponent
],
imports: [
PrintItemsRoutingModule,
SharedModule,
NgxsModule.forFeature([PrintItemsState])
],
providers: [
PrintItemsHttpService
]
})
export class PrintItemsModule {
}
</string,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que PrintItemsState se carga de forma perezosa, por lo que no puedes inyectarlo directamente en el selector. En su lugar, debes utilizar el token de inyección NGXS_STATE_CONTEXT para obtener el contexto del estado.

    Aquí tienes cómo puedes modificar tu código del selector para solucionar este problema:

    @Selector()
    static filter(ctx: StateContext<printitemsstatemodel>): KeyValue<string, string="">[] {
      const state = ctx.getState();
      const filters = state.fabricPage.page.Filter;
      const filterKeys = Object.keys(state.fabricPage.page.Filter);
      const activeFilters = [];
      filterKeys.forEach((key) => {
        if (filters[key]) {
          activeFilters.push({key: [key], value: filters[key]});
        }
      });
      return activeFilters;
    }
    

    Al utilizar StateContext en lugar del objeto de estado directamente, puedes evitar pasar el estado como argumento y obtener el estado actual desde el contexto en su lugar. Esto debería resolver el problema que estabas experimentando.</string,>

Comments are closed.