jQuery - ленивая загрузка dynatree и многоуровневый (тип 3) selectMode - PullRequest
2 голосов
/ 19 марта 2012

Я использую dynatree с параметром selectMode, установленным в 3 (многоуровневое).Я также использую флажки, поэтому, когда вы выбираете папку, также выбираются все дочерние элементы под ней.

У меня включена (и нужна) отложенная загрузка.

Проблема в том, что dynaДерево не загружает все дочерние элементы при выборе папки.Он выбирает только дочерние элементы, которые были загружены ранее.

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

Ответы [ 3 ]

1 голос
/ 21 марта 2013

Я обошел эту проблему, принудительно выбрав родительское значение после ленивого чтения:

onLazyRead: function (node) {
    if (!node.data.isLeaf) {
        node.appendAjax({
            success: function (node, event) {
                node.toggleSelect();
                node.toggleSelect();
            }
        });
    }
}
1 голос
/ 20 июня 2013

Я знаю, что немного опоздал на вечеринку, но я нашел решение и для этого. Надеюсь, это кому-нибудь поможет.

Для начала вам понадобится обработчик onSelect для дерева (если у вас его еще нет). Когда узел выбран, отметьте его как выбранный, а затем разверните, если это возможно. Вот мой:

onSelect: function(selected, node) {
    if (selected === true) {
        node.data.activateChildrenOnLoad = true; //Let the lazy children know
        //node.expand(true) did not work for me, but it might for you
        if (!node.isExpanded()) {
            node.toggleExpand();
        }
    }
}

Затем вам нужно вставить немного кода в вашу функцию onLazyRead. Я обрабатываю весь AJAX вручную, поэтому, если вы разрешите dynatree обрабатывать его для вас, вам, возможно, придется изменить некоторые вещи.

onLazyRead: function(node) {
    getNodesFromServer(function(nodes) {
        node.addChild({
            selected: node.data.activateChildrenOnLoad,
            activateChildrenOnLoad: node.data.activateChildrenOnLoad
        });

        if (node.data.activateChildrenOnLoad) {
            var nodes = node.getChildren();
            var last = nodes[nodes.length-1];
            if (!last.isSelected()) {
                last.toggleSelect();
            }
            if (!last.isExpanded()) {
                last.toggleExpand();
            }
        }
    });
}

И это все, что нужно сделать. Когда вы выбираете (проверяете) узел, он будет рекурсивно загружать, проверять и расширять все его ленивые дочерние элементы.

1 голос
/ 29 марта 2012

Если я правильно читаю, вы пытаетесь сделать так, чтобы дети "проверяли", когда вы "проверяете" родителей? И это не работает, потому что при ленивой загрузке дети еще не существуют.

Я обошел это, проверив, «выбран» ли родитель ребенка, которого я добавляю при отложенной загрузке. Если родитель «выбран», я загружаю уже выбранного ребенка.

Вот код для просмотра. Я получаю данные своего дерева из XMLHTTPREQUEST.
treeArray [0] = ParentKEY, treeArray [1] = ChildKEY и treeArray [2] = ChildTITLE

function addChildNode(NodeID, NodeName, ParentID){
    jQuery("#tree2").dynatree("getTree").getNodeByKey(ParentID).addChild({title: NodeName, key: NodeID, icon: false, isFolder: true, isLazy: false});
}

/*
*If treeArray[0] "ParentKEY" is selected, create the child already selected.
*/

if(jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[0]).isSelected() == true){
    if( jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[1]) == null){
        addChildNode(treeArray[1], treeArray[2], treeArray[0]);
        jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[1]).select();
    }
}else{
    if( jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[1]) == null){
        addChildNode(treeArray[1], treeArray[2], treeArray[0]);
    }
}
...