-1
votes

Comment supprimer / supprimer un élément de l'état normalisé?

J'ai la structure d'état suivante:

`ERROR TypeError: Cannot delete property '3' of [object Object]`


1 commentaires

Votre structure semble être des crochets manquants. Quelles sont les «entités»?


3 Réponses :


0
votes

Vous pouvez filtrer utiliser à la place de Supprimer;

newEntities = state.entities.filter(item => item.id !== action.id);

ctx.setState(
      patch<SportTypeStateModel>({
        entities: {...newEntities },
        IDs: state.IDs.filter(id => id !== action.id)
      })
    );


2 commentaires

Ce n'est pas un tableau. C'est un objet


@Poldo je pense que cela devrait être statities.entities.filter ((élément) => item.id! == action.id); et aussi correct ID: state.ids.filter ( id => id! == action.id) De même.



0
votes

La manière la plus simple serait simplement de filtrer l'état et le patch existant.

@Selector()
static IDs(state: YourStateModel) {
  return state.entities.map(e => e.id);
}


0 commentaires

0
votes

Nous devons d'abord comprendre pourquoi cette erreur se produit.

ngx utilise deepfreeze code> sous la hotte dans le mode de développement sur objet.freeze code> Votre état (et profondément imbriqué Objets / tableaux) Pour empêcher les mutations imprévisibles. P>

Vous pouvez vérifier en appelant objet.frozen code>: p> xxx pré>

j'ai compris votre point que entités code> n'est pas un tableau, mais un objet. strong> p>

donc le problème est une fois un objet congelé il n'y a pas de moyen de non libère-le. Qu'avons nous à faire? Nous devons dégeler l'objet d'état lui-même, les entités code> objet et ses enfants: p> xxx pré>

Je n'aime pas ce code alors don " t jetez des pierres sur moi :) strong> Je pense que vous pouvez rechercher des packages tels que profond non libèle code> pour être plus déclaratif. Oh, j'ai oublié la propriété code> IDS code>. Le code final est le suivant: P>

ctx.setState(state => {
  const newState = {
    entities: { ...state.entities },
    IDs: state.IDs.filter(id => id !== action.id)
  };
  for (const key of Object.keys(newState.entities)) {
    newState.entities[key] = { ...newState.entities[key] };
  }
  delete newState.entities[action.id];
  return newState;
});


3 commentaires

Je pense que c'est exactement ce que je dois faire. Je suis surpris qu'il n'y ait plus d'informations sur la manière de faire cette opération avec un objet entité normalisé. La douleur parce que lorsqu'un objet d'entité unique contient des propriétés de réseau telles que des ligues: [] et chaque objet de ligue contient des équipes []. Je pourrais utiliser Lodash Clonedeep () pour que tout soit copié, mais je ne sais pas si je le devais, surtout que j'ai trois magasins pour des types de sport, des ligues et des équipes, et chacune de ces entités a une propriété de référence au parent. Grande explication!


@ O.Meekoh Dois-je mettre à jour ma réponse et donner une autre explication sur une partie, que vous avez besoin, cette réponse pourrait donc être acceptée?


Ce serait génial!