Struktur ngrx menggunakan anglefire2 dengan stateChanges ()

Bisakah saya memiliki kumpulan entitas dalam suatu entitas menggunakan Ngrx - Adaptor Entitas?

Saya perlu membuat kumpulan entitas dalam suatu entitas, bagaimana cara melakukannya menggunakan NgRx dengan Cloud Firestore?

Saya tahu saya bisa membuat array di dalam dokumen Pizza, tapi saya ingin melakukannya menggunakan skalabilitas Cloud Firestore karena saya ingin menjalankan fungsi dengan Cloud Functions dinamis.

Saya ingin sesuatu seperti apa yang ada di AngularFire2 State Changex With Ngrx pelajaran, tapi saya ingin memiliki topping untuk setiap Pizza yang harus tetap dalam status Pizza di setiap entitas.

Jalur Cloud Firestore:

PathRefPizza: pizzas/{pizaId};

PathRefTopping: pizzas/{pizaId}/toppings/{toppingId};

export function pizzasReducer(
    state: PizzaState = initialState,
    action: ActionPizza) {

switch (action.type) {

    case actionsPizza.PIZZA_ADDED: {
        return unidadeAdapter.addOne(action.payload, state)
    };

    case actionsPizza.PIZZA_MODIFIED:
        return pizzaAdapter.updateOne({
            id: action.payload.id,
            changes: action.payload
        }, state)

    case actionsPizza.PIZZA_REMOVED:
        return pizzaAdapter.removeOne(action.payload.id, state)

    case actionsPizza.TOPPING_ADDED: {
        // Here I need to add Toppings inside a Pizza entity in which it belongs.
        return toppingsAdapter.addOne(action.payload, state);
    }

    default:
        return state;
}

Data di negara bagian harus sebagai berikut.

pizzas: {
    ids: [...]
    entities: [
        {'pizza1': {id: 'pizza1, name: 'Pizza 1', toppings: [...]},
        {'pizza2': {id: 'pizza2, name: 'Pizza 2', toppings: [...]}
        {'pizza3': {id: 'pizza3, name: 'Pizza 3', toppings: [...]}
        {'pizza4': {id: 'pizza4, name: 'Pizza 4', toppings: [...]}
        {'pizza5': {id: 'pizza5, name: 'Pizza 5', toppings: [...]}
    ];
}

Bagaimana saya melakukan ini menggunakan manajemen negara ngrx? Jika ada yang bisa membantu saya bagaimana saya bisa melakukan ini, saya akan sangat berterima kasih untuk itu, ini sangat penting bagi saya!!!


person Luiz Ricardo Cardoso    schedule 13.06.2019    source sumber


Jawaban (1)


Maaf, tapi melakukan hal itu bukanlah praktik yang baik. Dengan manajemen negara (pola redux) dan karenanya ngrx, Anda harus menormalkan toko Anda.

Rekomendasikan pembacaan untuk pola Redux.

Artinya, dalam kasus Anda, Anda harus memiliki ngrx entity khusus untuk model Topping Anda.

Toko Anda akan terlihat seperti di bawah ini:

state {
  pizzas: {
    ids: [...]
    entities: [
        {'pizza1': {id: 'pizza1, name: 'Pizza 1', ...},
        {'pizza2': {id: 'pizza2, name: 'Pizza 2', ...},    
    ];
  },
  toppings: {
    ids: [...]
    entities: [
        {'topping1': {id: 'topping1, pizzaId: 'pizza1', name: 'Topping 1', ...},
        {'topping2': {id: 'topping2, pizzaId: 'pizza1', name: 'Topping 2', ...},    
    ];
  }
}

Kemudian melalui selectors Anda akan dapat mengambil daftar topppings untuk pizza yang dipilih:

getToppings = createSelector(getSelectedPizzaId, getAllToppings, (state, selectedPizzaId, allToppings) => {
  return allToppings.filter(topping => topping.pizzaId === selectedPizzaId)
});

Untuk kinerja yang lebih baik, Anda juga dapat mempertimbangkan untuk membuat entity ketiga opsional yang didedikasikan untuk hubungan antara pizza dan toppings:

store {
  ...
  pizzaToppingIds {
    entities: [
      {'pizza1': { toppingIds: ['topping1', 'topping2']},
      {'pizza2': { toppingIds: ['topping3', 'topping4']},    
    ];
  }
}

Dalam hal ini, selector seharusnya: (disederhanakan, beberapa tes hilang...)

getToppings = createSelector(getSelectedPizzaId, getPizzaToppingEntities, getToppingEntities, (state, selectedPizzaId, pizzaToppingEntities, toppingEntities) => {
  return pizzaToppingEntities[selectedPizzaId].toppingIds
    .map(id => toppingEntities[id];
});

Jika Anda benar-benar ingin mengulangi pola umum dan praktik yang baik ini, Anda selalu dapat mempertimbangkan untuk memperbarui entitas pizza setiap kali topping ditambahkan. Tapi itu akan memperbarui seluruh entity.

Sekali lagi, ini akan berfungsi tetapi state management arsitektur aplikasi Anda akan kehilangan sebagian daya tarik dan kekuatannya.

person Thierry Falvo    schedule 08.07.2019