2017-07-04 4 views
1

Ich verwende Qooxdoo, um ein benutzerdefiniertes virtualTree zu erstellen, das wie erwartet funktioniert, bis ich einen Knoten öffne/schließe/öffne. Es ist dann ein Durcheinander. Ich weiß nicht, welchen Teil ich vermisse.Anpassen von VirtualTree in Qooxdoo funktioniert nicht wie erwartet

hier ist ein Codebeispiel: virtual tree

zu reproduzieren, öffnen Sie bitte einen Knoten (zum Beispiel "DEP1"). Sie können Kinder schweben und alles ist in Ordnung. Schließen Sie jetzt den Knoten und öffnen Sie ihn erneut. Jetzt werden die Symbole im Knoten geändert und der Knoten erhält den Hover-Effekt, was beim ersten Öffnen nicht der Fall ist.

Fehle ich etwas?

Grüße

Code unten:

var data = { 
 
\t "label": "ROOT", 
 
\t 
 
\t "children" : [ 
 
    { 
 
     "LDEP" : "Dep1", 
 
     "children" : [ 
 
     { 
 
      "CVEH" : 1, 
 
      "LVEH" : "veh1_1" 
 
     }, 
 
     { 
 
      "CVEH" : 2, 
 
      "LVEH" : "veh1_2" 
 
     } 
 
     ] 
 
    }, 
 
    
 
    { 
 
     "LDEP" : "Dep2", 
 
     "children" : [ 
 
     { 
 
      "CVEH" : 3, 
 
      "LVEH" : "veh2_1" 
 
     }, 
 
     { 
 
      "CVEH" : 4, 
 
      "LVEH" : "veh2_2" 
 
     } 
 
     ] 
 
    }, 
 
    
 
    ] 
 
    
 
}; 
 
var model = qx.data.marshal.Json.createModel(data, false); 
 
var vtree = new qx.ui.tree.VirtualTree(model, "children", "children"); 
 

 
this.getRoot().add(vtree, 
 
{ 
 
    left : 100, 
 
    right : 100, 
 
    top : 50 
 
}); 
 

 
vtree.set({ 
 
\t showTopLevelOpenCloseIcons : true, 
 
\t hideRoot : true, 
 
\t backgroundColor : "gray" 
 
}); 
 
\t \t \t 
 
/* label options */ 
 
vtree.setLabelOptions({ 
 
    converter : function(value, model) 
 
    { 
 
    \t if (value){ 
 
    \t \t return "<b>" + model.get("LDEP") + "</b>"; 
 
    \t } 
 
    \t else 
 
    \t { 
 
    \t \t return model.get("LVEH"); 
 
    \t } 
 
    } 
 
}); 
 
\t \t \t  
 

 
/* 
 
* icon options, if a dep then return a generic symbol else return 
 
* vehicle icon 
 
*/ 
 
vtree.setIconPath("children"); 
 
vtree.setIconOptions({ 
 
    converter : function(value, model) 
 
    { 
 
    \t if (value){ 
 
    \t \t return "icon/22/mimetypes/text-html.png"; 
 
    \t } 
 
    \t else 
 
    \t { 
 
    \t \t return "icon/22/mimetypes/media-image.png" 
 
    \t } 
 
    } 
 
}); 
 

 

 
var delegate = { 
 
    bindItem : function(controller, item, index) 
 
    { 
 
     controller.bindDefaultProperties(item, index); 
 
     
 
     //set icon size to 24x24 for leaves 
 
     var icon = item.getChildControl("icon"); 
 
     if(item.getModel().getChildren){ 
 
     \t //dept 
 
     \t item.setBackgroundColor("gray"); 
 
     } else { 
 
     \t //vehicle 
 
     \t item.setBackgroundColor("white"); 
 
     \t icon.set({ 
 
     \t \t width \t : 32, 
 
     \t \t height \t : 32, 
 
     \t \t scale \t : true, 
 
     \t \t marginTop : -4 
 
     \t }); 
 
     } 
 
    
 
     //labels, accept html 
 
     var lbl = item.getChildControl("label"); 
 
     lbl.set({ 
 
     \t rich : true, 
 
     \t textColor : "black" 
 
     }); 
 
    
 
     //change color on pointerin and pointerout of vehicles 
 
     if (!item.getModel().getChildren){ 
 
    \t item.addListener("pointerover", function(){ 
 
    \t \t item.getChildControl("label").fadeIn(100); 
 
    \t \t item.setBackgroundColor("blue"); 
 
    \t \t item.getChildControl("label").setTextColor("orange"); 
 
    \t }); 
 
    \t 
 
    \t item.addListener("pointerout", function(){ 
 
    \t \t item.setBackgroundColor("white"); 
 
    \t \t item.getChildControl("label").setTextColor("black"); 
 
    \t }); 
 
     } 
 
    }, 
 
    
 
    /* 
 
    * sorting 
 
    */ 
 
    sorter : function(a, b){ 
 
    \t var A = (a.getChildren? a.get("LDEP") : a.get("LVEH")).toUpperCase(), 
 
    \t \t B = (b.getChildren? b.get("LDEP") : b.get("LVEH")).toUpperCase(); 
 
    \t \t 
 
    \t return A > B ? 1 : A < B ? -1 : 0; 
 
    } 
 
}; 
 
    
 
vtree.setDelegate(delegate);

Antwort

1

Um die Auswirkungen zu verstehen Sie beobachten, braucht es Verständnis darüber, wie virtuelle Widgets arbeiten in qooxdoo.

Virtuelles Widget bedeutet, dass Sie riesige Datenmengen anzeigen können, nur wenige Widgets, die den sichtbaren Inhalt darstellen. Stellen Sie sich einen Baum mit Hunderten von Knoten und Kindknoten vor, aber Sie haben nur 10 Knoten gleichzeitig. Das virtuelle Widget instanziiert dann so viele echte Widgets wie nötig und verwendet diese Widgets erneut, um den sichtbaren Teil des Baums anzuzeigen.

Das virtuelle Baum-Widget, das Knoten und Blätter eines Baums anzeigt, verwendet die instanziierten Widgets erneut, indem das Modell des Widgets und dessen Aussehen geändert werden. Auf diese Weise kann es passieren, dass bei einer Benutzerinteraktion ein virtueller Baumknoten von einem Objekt gerendert wird, das zuvor eine Leaf-Anzeige angezeigt hat.

All dies geschieht über die Delegaten bindItem Member-Funktion, die jedes Mal aufgerufen wird, wenn ein echtes Widget für ein virtuelles Element wiederverwendet wird. Das Hinzufügen eines Ereignis-Listeners in bindItem fügt anschließend mehr und mehr Ereignis-Listener zu einer einzelnen Widget-Baum-/Blatt-Instanz hinzu und zeigt die von Ihnen beschriebenen Effekte.

Um zu erreichen, was Sie wollen, müssen Sie Ihre Logik in das Delegiertenmitglied configureItem hinzufügen, das nur einmal bei der Instanziierung eines Baumobjekt-Widgets aufgerufen wird. Dort müssen Sie zwischen dem Objekt unterscheiden, das gerade einen Knoten oder ein Blatt anzeigt, das Sie einfach erreichen können, indem Sie das aktuelle Aussehen dieses Artikels über item.getAppearance() erhalten. Das Ergebnis ist entweder virtual-tree-file für ein Blatt und virtual-tree-folder für einen Knoten.

Die Ereignis-Listener, die für und pointerout hinzugefügt werden, sollten dann die erforderlichen Stile je nach Aussehen hinzufügen.

Beachten Sie, dass dies besser durch ein benutzerdefiniertes Aussehensthema gehandhabt werden sollte, wo Sie die meisten verwendeten Stile basierend auf den Widgets states wie Hover hinzufügen können, neben der Animation für das Label Kind Control mit dem Einblendungsetikett.

Bitte fügen Sie den folgenden Kern in den qooxdoo Spielplatz, wo ich ein Beispiel erstellt haben, die die Sprache alle oben zeigt:

https://gist.github.com/level420/ba4e25f98618064f91f5aa6cb6bb1124

+0

danken Ihnen sehr, zuerst für die lange und klare Erklärung, die zweite für das Beispiel, das wie ein Zauber wirkt. BTW Ich habe angefangen, configureItem zu schreiben, war mir aber nicht ganz sicher, ob es der richtige Weg ist, also habe ich nach Tagen der Tests beschlossen, hier zu posten. Mit Themen zu arbeiten ist eine andere Geschichte, ich bin begierig darauf, es zu lernen, hatte aber immer noch nicht genug Zeit, um sich damit zu beschäftigen. Nochmals vielen Dank. – Salih

Verwandte Themen