2010-06-22 5 views
0

http://wwwendt.de/tech/dynatree/index.htmlDynatree addChild - question pour l'auteur

du composant, je voudrais clarifier les points suivants: lorsque addChild est invoquée - fait l'arbre entier est ré-rendu ou seulement les noeuds modifiés (noeuds ajoutés et les noeuds avoir de nouveaux enfants)?

Je reçois 2 pièces contradictoires de l'info: Lazy Loading in dynatree il est dit que seuls les noeuds affectés sont réactivées rendus

Dynatree slow when dynamically loaded with 100+ nodes ici, il dit qu'il ne se re-rendu tous les addChild temps est utilisé

Peut-être qu'il me manque quelque chose?

Lequel est-ce? Dynatree stocke les noeuds dans une structure interne

Répondre

1

'Rendu' est le processus de création ou de mise à jour des éléments HTML en le DOM à reflète l'état de l'arbre. Par exemple le dernier nœud d'une branche a un nom de classe spécial, donc en ajoutant un nœud nécessite de supprimer cette classe du précédent 'dernier nœud' et en l'ajoutant au nouveau .

Chaque fois que vous appelez .addChild (données), le rendu est déclenché. Si vous passez 100 nœuds avec un appel, le rendu est effectué une seule fois, alors c'est toujours plus performant que de l'appeler 100 fois avec un seul nœud .

Actuellement (Version 0.5.4) addChild utilise ce modèle:

var prevFlag = tree.enableUpdate(false); 
[modify the tree] 
tree.enableUpdate(prevFlag); 

enableUpdate (true) appelle tree.redraw(), de sorte que l'arbre entier est mis à jour. Cela va changer avec la version 1.0, mais même alors, il sera plus rapide de combiner addChild appels.

Un autre aspect est: lorsque sont les noeuds créés dans le DOM. La création d'éléments HTML à partir de la version 1.0 est différée jusqu'à ce que le noeud devienne visible (développé) pour la première fois. Il est donc possible de charger un très grand nombre de nœuds dans la structure de données Dynatree interne efficace sans gonfler le DOM.

S'il est plus facile de pré-charger l'arbre entier, ou de charger paresseux branches simples sur demande, dépend du serveur, du réseau et du client. C'est donc toujours une question d'analyse comparative des différents scénarios.

+0

Merci pour l'info, juste une précision de plus: quand .addChild (nodesToAdd) est appelé, les nœuds existants sont-ils également redessinés? Je comprends que (évidemment) les nodesToAdd seront rendus, mais qu'en est-il des nœuds existants. Est-ce que cela redessine tout l'arbre? – sarsnake

+0

Je viens de lire votre réponse et je comprends que la réponse est Oui :) Il semble que chaque fois que des nœuds changent, l'arbre est redessiné. Il semble que var prevFlag = tree.enableUpdate (faux); renvoie 'true' si des nœuds ont été modifiés, ce qui signifie que l'arborescence entière sera redessinée. Est-ce que ma compréhension est correcte? merci encore pour votre temps. – sarsnake

+0

enableUpdate (..) renvoie le mode de mise à jour précédent. Ce modèle permet de restaurer l'état précédent (même dans une hiérarchie d'appels récursifs). Comme nous ne gardons aucune trace des modifications, enableUpdate (true) doit toujours mettre à jour l'arbre entier: créer de nouveaux noeuds et mettre à jour les noms de classe pour les existants. Pour v1.0 je pourrais changer l'implémentation de mynode.addChild (childOrChildList) pour redessiner la branche mynode seulement. – mar10

Questions connexes