données parent calculées à partir des champs enfants de la structure de données hiérarchique
-
06-07-2019 - |
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!
La solution
Nous faisons cela en suivant ce modèle:
- Créez la méthode de calcul de la valeur sur la classe parente et rendez-la utilisable avec un événement.
- 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.
- 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