données parent calculées à partir des champs enfants de la structure de données hiérarchique

StackOverflow https://stackoverflow.com/questions/1008415

Question

En flex 3, j'ai une structure de données hiérarchique. Je voudrais afficher le contenu de celui-ci dans un arbre. Mon problème est que j'ai des nœuds dont les données sont calculées à partir des nœuds enfants. Comment structurer la hiérarchie pour apporter des modifications automatiques à ces nœuds parents, si les données de leurs enfants ont changé? Par exemple:

  • Chaque nœud a un drapeau d'avertissement. Si certains indicateurs d'avertissement d'enfants ont été remplacés par true, l'indicateur d'avertissement parent devrait automatiquement être défini sur true.
  • Un champ de nombre entier de nœuds est la somme des champs de nombre entier enfants et, si l'un des enfants change, le champ entier parent "calcule". la somme immédiatement.

Existe-t-il une solution simple avec de bonnes modifications de la structuration ou des fonctions personnalisées?

Merci!

Était-ce utile?

La solution

Nous faisons cela en suivant ce modèle:

  1. Créez la méthode de calcul de la valeur sur la classe parente et rendez-la utilisable avec un événement.
  2. Dans le parent, ajoutez un écouteur d'événements pour le moment où la collection enfant change. Pour ce faire, la collection enfant doit être un ArrayCollection ou similaire.
  3. Lors de l'interception de l'événement change, lève (ou conditionnellement) l'événement associé aux métadonnées Bindable pour la méthode mentionnée à l'étape 1.

Ceci devrait entraîner la mise à jour de toute interface utilisateur surveillant la propriété d'agrégation du parent à chaque fois qu'un enfant est mis à jour.

Voici un exemple:

public class Parent
{
    private var children:ArrayCollection = new ArrayCollection();

    public function Parent()
    {
        children.addEventListener(
            CollectionEvent.COLLECTION_CHANGE, 
            function(evt:CollectionEvent):void
            {
                if (...)
                {
                    dispatchEvent(new Event("warningStateChanged"));
                }
            }
        );
    }

    [Bindable("warningStateChanged")]
    public function containsWarnings():Boolean
    {
        for each (var child:Child in children)
        {
            if (child.hasWarning)
            {
                return true;
            }
        }
        return false;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top