2012-04-09 13 views
2

Ich möchte einen Knoten innerhalb oder unter einem vorhandenen Knoten erstellen, abhängig davon, ob es sich um einen Stammknoten handelt. (Ein Baum-Widget ist normalerweise eine Liste von Bäumen oder ein Baum ohne sichtbaren Wurzelknoten.)Wie identifiziere ich einen Knoten als Wurzelknoten?

Ich habe get_parent versucht, aber woher weiß ich, ob das ein Wurzelknoten ist?

Was mich verwirrt ist, dass get_node das gleiche Objekt wie get_parent zurückgibt.

Ich verwende jstree_pre1.0_fix_1.

bearbeitet:

I endete für die bekannte ID des Mutter der Mutter Überprüfung auf.

var node = $(e.replyto); 
if (node.length) { 
    if (node.parent().parent().attr('id') == 'demo1') { 
    $("#demo1").jstree("create_node", node, 'last',{'attr': {'id':e.id}, 'state':'open', 'data': e.data}) ; 
    } else { 
    $("#demo1").jstree("create_node", node, 'after',{'attr': {'id':e.id}, 'state':'open', 'data': e.data}) ; 
    } 
} else { 
    $("#demo1").jstree("create_node", -1, 'after',{'attr': {'id':e.id}, 'state':'open', 'data': e.data}); 
} 
+0

In den meisten Implementierungen ist der Elternknoten des Stammknotens entweder 'null' oder selbst. Vielleicht ist das der Fall. – kirilloid

+0

Definieren Sie "einen Top-Level-Knoten". – RobG

+0

Ich habe die Frage bearbeitet und den Knoten der obersten Ebene durch den Wurzelknoten ersetzt und versucht, ihn zu definieren. –

Antwort

3

Sie können get_parent() auf dem Knoten aufrufen. Wenn es '#' zurückgibt, ist der Knoten ein Wurzelknoten. E.G:

var node = ...; 

if($('#demo1').jstree(true).get_parent(node) == '#') { 
    // node is a root node 
} 
2

Es ist nicht die ideale Lösung, aber sie _get_children mit -1 in param können alle Wurzelknoten und Test zu erhalten, wenn Ihr Knoten in der Liste ist.

._get_children (node) 
    Use -1 to return all root nodes. 

(von http://www.jstree.com/documentation/core)

+0

Danke. Gute Lösung für den Anfang. Wenn es für eine lineare Suche zu langsam ist, kann ich sie mit einem zusätzlichen Attribut versehen, wenn ich die Wurzelknoten einfüge. –

+0

Sie können den Container auch mit 'get_container_ul()' abrufen und die jQuery-Funktion [.contains()] (http://api.jquery.com/jQuery.contains/) verwenden. –

1

Ich habe ein bisschen kämpfen mit diesem, weil ich versuche, das Kontextmenü-Plugin zu verwenden. Ich möchte nicht, dass der Benutzer einen neuen Stammknoten erstellen kann. Ich möchte nur zulassen, dass sie Unterknoten erstellen. (Die Wurzelknoten stellen die Gruppen dar, denen der aktuelle Benutzer angehört, und ist daher vom Administrator voreingestellt). Meine erste Verwirrung war, dass _get_children ein Objekt mit einer length Eigenschaft zurückgibt. Es ist kein Array, aber es hat eine length Eigenschaft, die korrekt der Anzahl der tatsächlichen Wurzelknoten entspricht. Betrachtet man den zugrunde liegenden Code, verwendet die jstree_get_children Methode die children-Methode von jQuery, die die untergeordneten Knoten mit den Indizes 0, 1, 2 usw. zusammen mit anderen jQuery-Eigenschaften und -Methoden zurückgibt. Ich fand es praktisch, nur das Array von Knoten zu extrahieren und indexOf zu verwenden, um zu überprüfen, ob der aktuelle Knoten ein Stammknoten ist. So, hier ist ein Ausschnitt aus der items Eigenschaft meiner jstree Kontextmenü Konfiguration:

'items': function(node){ 
    var rootChildren = this._get_children(-1), 
    rootNodes = [], 
    i; 
    //rootChildren is now a fancy jQuery object with the child nodes assigned 
    //to keys 0, 1 etc. 
    //Now create a simple array 
    for(i = 0; i < rootChildren.length; i += 1){ 
     rootNodes[i] = rootChildren[i]; 
    } 
    //We can now use indexOf to check if the current node is in that array 
    //Note again that node is a fancy jQuery object, the actual DOM element 
    //is stored in node[0] 
    console.log(rootNodes.indexOf(node[0]) > -1); 
    //code here to add whatever items you want to the context menu. 
} 

Wenn Sie rund um Ihren Baum klicken Sie true im Konsolenfenster für den Wurzelknoten und false für alle Knoten sehen unteren die Hierarchie runter. Beachten Sie, dass für IE unter 8 (glaube ich), müssen Sie eine indexOf Methode für Array liefern, da frühere Versionen von IE indexOf nicht als native Methode liefern.

Verwandte Themen