2012-04-09 7 views
2

Я хочу создать узел внутри или под существующим узлом в зависимости от того, является ли он корневым узлом. (виджет дерева обычно представляет собой список деревьев или дерево без видимого корневого узла.)Как определить узел как корневой узел?

Я пробовал get_parent, но как узнать, является ли это корневым узлом?

var parent = $("#demo1").jstree('_get_parent', $("#foo")); 
var node = $("#demo1").jstree('_get_node', $("#foo")); 

Что смущает меня, так это то, что get_node возвращает тот же объект, что и get_parent.

Я использую jstree_pre1.0_fix_1.

отредактирован:

я в конечном итоге проверки известного идентификатора родителя родителя.

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

В большинстве реализаций родительский корневой узел является либо «null», либо сам. Может быть, это так. – kirilloid

+0

Определите «узел верхнего уровня». – RobG

+0

Я отредактировал вопрос и заменил узел верхнего уровня корневым узлом и попытался его определить. –

ответ

3

Вы можете позвонить get_parent() на узел. Если он возвращает «#», то узел является корневым узлом. E.G:

var node = ...; 

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

Это не идеальное решение, но вы можете использовать _get_children с -1 в парах, чтобы получить все корневые узлы и тест, если ваш узел находится в списке.

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

(от http://www.jstree.com/documentation/core)

+0

Спасибо. Хорошее решение для начала. Если слишком медленно выполнять линейный поиск в каждой вставке, я могу пометить их дополнительным атрибутом при вставке корневых узлов. –

+0

Вы также можете получить контейнер с 'get_container_ul()' и использовать функцию jQuery [.contains()] (http://api.jquery.com/jQuery.contains/) –

1

Я боролся немного с этим, потому что я пытаюсь использовать плагин контекстного меню. Я не хочу, чтобы пользователь мог создать новый корневой узел. Я только хочу разрешить им создавать суб-узлы. (Корневые узлы представляют группы, к которым принадлежит текущий пользователь, поэтому заранее заданы администратором). Моя первая путаница заключалась в том, что _get_children возвращает объект с length. Это не массив, но он имеет свойство length, соответствующее правильному количеству фактических корневых узлов. Рассматривая базовый код, метод jstree_get_children использует метод jQuery children, который возвращает дочерние узлы с индексами 0, 1, 2 и так далее вместе с другими свойствами и методами jQuery. Мне было удобно извлекать только массив узлов и использовать indexOf, чтобы проверить, является ли текущий узел корневым узлом. Итак, вот отрывок из items свойства моей конфигурации меню jstree контекста:

'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. 
} 

Если вы щелкните правую кнопку мыши вокруг дерева, вы увидите true в окне консоли для корневых узлов и false для любых узлов нижних вниз по иерархии. Обратите внимание, что для IE ниже 8 (я думаю) вам нужно будет указать метод indexOf для Array, потому что более ранние версии IE не предоставляют indexOf в качестве нативного метода.

Смежные вопросы