angular - NgRx Data - Hur man kopplar in i en addOne-success Action på ett typ-säkert sätt?


Jag är ny på @ngrx/data och jag går igenom dokumentationen.

Med hjälp av guiden har jag kunnat återskapa det jag tidigare gjort manuellt - till exempel genom att använda tjänsten på denna översiktssida fungerar följande genom att anropa REST-API och lägga till leverantör till butiken.

komponent.ts

  onSave(supplier: Supplier) {
    this.supplierService.add(supplier);
  }

Jag vet att för effekten kan jag göra följande:

  hello$ = createEffect(
    () =>
      this.actions$.pipe(
        ofType('[Supplier] @ngrx/data/save/add-one/success'),
        tap(console.log)
      ),
    { dispatch: false }
  );

MEN - finns det ett typsäkert sätt att koppla in sig på en lyckad API-anropsåtgärd/entitetsåtgärder i allmänhet?

Uppdatering - förtydligande

Jag använder @ngrx/data och så jag skapar inte handlingarna direkt själv tillsammans med exporten av typer.

Vid lyckad tilläggning av en leverantör - vilket efter ett HTTP-anrop resulterar i en åtgärd med typen: '[Supplier] @ngrx/data/save/add-one/success' - vill jag utföra en effekt. Istället för att använda strängen '[Supplier] @ngrx/data/save/add-one/success' (visad ovan) finns det en typ-säker krok?

Tidigare (när jag själv skapade åtgärderna) skulle jag exportera en uniontyp och göra ofType(supplierActions.addSupplier)

Uppdatering - närmare ett svar

Hittade ofEntityType och ofEntityOp vilket tar mig närmare mitt mål eftersom dessa fungerar som ofType:

  hello$ = createEffect(
    () =>
      this.actions$.pipe(
        ofEntityType('Supplier'),
        ofEntityOp(EntityOp.SAVE_ADD_ONE_SUCCESS),
        tap(console.log)
      ),
    { dispatch: false }
  );

Nu gäller det bara att hitta ett sätt att skriva 'Supplier' från entityMetadata

const entityMetadata: EntityMetadataMap = {
  Supplier: {}
};

Svar #1

Du kan göra något liknande detta:

let array = Object.keys(entityConfig.entityMetadata);

det kommer att returnera namnet på dina enheter, i det här fallet "Leverantör". sedan använder du bara arrayen som parameter för ofEntityType

hello$ = createEffect(
    () =>
      this.actions$.pipe(
        ofEntityType(array),
        ofEntityOp(EntityOp.SAVE_ADD_ONE_SUCCESS),
        tap(console.log)
      ),
    { dispatch: false }
  );

Relaterade artiklar