Кендо Treeview Expand Node

У меня есть это древовидное представление, которое может иметь переменное количество детей (некоторые узлы могут иметь до 3 поколений детей, некоторые могут иметь только одно и т. Д.)

Я пытаюсь расширить определенный узел при загрузке древовидной структуры. И у меня есть 2 проблемы: 1) Я не могу найти событие / обратный вызов, чтобы знать, когда древовидное представление будет готово 2) Функция расширения не всегда работает (я объясню)

Это мое древовидное представление:

function InitializeTreeview() {

var Children_Merchants = {
    transport: {
        read: {
            url: function (options) {
                return kendo.format(websiteRootUrl + '/Merchants/Merchants/?hasParents={0}',   hasParent);
            }
        }
    },
    schema: {
        model: {
             model: {
            id: "ID",
            hasChildren: true,
            children: Children_Merchants
        }
        }
    }
};

var Brandowners = new kendo.data.HierarchicalDataSource({
    transport: {
        read: {
            url: kendo.format(websiteRootUrl + '/Merchants/GetBrandowners?databaseID={0}',       selectedDatabaseID)
      }
    },
    //change: ExpandNode, - if I call expand node like this, it works.
    schema: {
        model: {
            id: "ID",
            hasChildren: true,
            children: Children_Merchants
        }
    }
});


$('#treeview').kendoTreeView({
    dataSource: Brandowners,
    animation: {
        collapse: {
            duration: 200,
            effects: "fadeOut"
        },
        expand: {
            duration: 200,
            effects: "fadeIn"
        }

    },
    dataTextField: "Name",
    complete: function () {  alert('ok'); },
    //dataBound    : ExpandNode,
    select: OnSelect,
    expand: CheckIfHasParent
}).data('kendoTreeView');
}

function ExpandNode() {
    var treeview;
    treeview = $("#treeview").data("kendoTreeView");
    var nodeToExpand = treeview.findByText('Adam'); //dummy txt, will have from parameter
    treeview.expand(nodeToExpand);
}

Связь данных работает нормально, мои контроллеры вызываются, все в порядке. Я попробовал подключить функцию ExpandNode одним нажатием кнопки. Функция вызывается, но ничего не происходит. НО, если я подключу его к событию изменения родительского источника данных, он сработает. Еще одна интересная вещь заключается в том, что выбор работает, поэтому, если я заменю treeview.expand (...) на treeview.select (...), он будет работать по щелчку.

Итак, мои вопросы:

1) Какое событие я должен использовать для loadEnd (или чего-то подобного) - чтобы мне не пришлось связывать функцию с нажатием кнопки (все еще нормально, но я предпочитаю, чтобы загрузка закончилась) - P.S. Я перепробовал все, что нашел на форумах по кендо, например: change, requestEnd, success, dataBound, и они не работают. Я попытался отправить JSON со свойством «расширенный», установленным на ИСТИНА, для рассматриваемого узла, но это только изменяет стрелку так, чтобы она отображалась так, как будто она открыта, но не вызывает контроллер и не загружает дочерние элементы.

2) Вы знаете, почему ExpandNode работает только при привязке к событию изменения? - самый важный для меня вопрос.

3) Если у вас есть предложения или я сделал что-то не так при инициализации древовидной структуры, сообщите мне.


person Vlad    schedule 08.07.2013    source источник
comment
Я уже пробовал, меняет только стрелку на расширенный режим   -  person Vlad    schedule 08.07.2013
comment
Вы выполняете загрузку по запросу или загружаете все дерево за одну передачу?   -  person OnaBai    schedule 08.07.2013
comment
Я попытался установить для loadOnDemmand значение false и отправить expand = true. а затем БУМ. некоторые 2-3 узла были расширены дочерними элементами и все такое. но у меня всего 100+ родителей + поколения, он рекламирует примерно до 40000 узлов. Так он разбился. Думаю, это было бы решением, но для меня это нехорошо   -  person Vlad    schedule 08.07.2013
comment
Более подробно изучить свой код ... Почему Children_Merchants не является HierarchicalDataSource?   -  person OnaBai    schedule 08.07.2013
comment
У меня был пример в том же проекте, поэтому я поискал там источник данных и древовидный файл init. Честно говоря, я не совсем понимаю, как это происходит. это просто происходит рекурсивно. - Я был поражен, когда узнал, что у меня более двух уровней :) Между тем я вижу, что: если я разверну узел «Адам», нацеленный на ExpandNode (), закрою его, а затем нажму кнопку, он расширяется вместе с детьми. Итак, я предполагаю, что дети должны быть загружены к моменту выполнения teeview.expand (...), вы согласны?   -  person Vlad    schedule 08.07.2013
comment
Да! ; Остальные проблемы, которые я видел в SO относительно Kendo UI (неочевидные), связаны с синхронизацией того, как и когда что-то происходит. Тот факт, что вы создаете дерево, не означает, что оно заполняется немедленно, это означает, что оно отправляет чтение на серверы, когда данные получены, Kendo UI получает результаты, позволяет вам вносить некоторые изменения в данные, а затем начинает заполнять HTML. Итак, если вы попытаетесь что-то расширить до того, как появятся данные или до того, как будет сгенерирован HTML: ничего не произойдет. Я также обнаружил, что иногда документы для событий нечеткие или непоследовательные от виджета к виджету.   -  person OnaBai    schedule 08.07.2013


Ответы (4)


Я скопировал ваш код с некоторыми бесплатными интерпретациями, и ответ на ваши вопросы следующий:

  1. Какое событие следует использовать для loadEnd = › dataBound
  2. Вы знаете, почему ExpandNode работает только при привязке к событию изменения? = › Нет, работает без привязки к событию change. Если это не так, значит, в вашем коде есть что-то еще.
  3. Предложения = › Отсутствует некоторая информация о вашем коде, которая может иметь значение для того, что я реализовал.
  4. Что такое CheckIfHasParent? = › Я реализовал это как функцию, которая на самом деле ничего не делает.
  5. Что такое hasParent? = › Я проигнорировал это.

Код, как я его пишу:

$(document).ready(function () {
        function InitializeTreeview() {
            var Children_Merchants = {
                transport: {
                    read: function (op) {
                        var id = op.data.ID;
                        var data = [];
                        for (var i = 0; i < 10; i++) {
                            var aux = id * 100 + i;
                            data.push({ Name: "Name-" + aux, ID: aux});
                        }
                        op.success(data);
                    }
                },
                schema   : {
                    model: {
                        model: {
                            id         : "ID",
                            hasChildren: true,
                            children   : Children_Merchants
                        }
                    }
                }
            };
    
            var Brandowners = new kendo.data.HierarchicalDataSource({
                transport: {
                    read: function (op) {
                        op.success([
                            {"Name": "Adam", "ID": 1},
                            {"Name": "Benjamin", "ID": 2},
                            {"Name": "Caleb", "ID": 3},
                            {"Name": "Daniel", "ID": 4},
                            {"Name": "Ephraim", "ID": 5},
                            {"Name": "Frank", "ID": 6},
                            {"Name": "Gideon", "ID": 7}
                        ])
                    }
                },
                //change: ExpandNode, - if I call expand node like this, it works.
                schema   : {
                    model: {
                        id         : "ID",
                        hasChildren: true,
                        children   : Children_Merchants
                    }
                }
            });
    
            $('#treeview').kendoTreeView({
                dataSource   : Brandowners,
                animation    : {
                    collapse: {
                        duration: 200,
                        effects : "fadeOut"
                    },
                    expand  : {
                        duration: 200,
                        effects : "fadeIn"
                    }
    
                },
                dataTextField: "Name",
                dataBound    : ExpandNode,
                expand       : CheckIfHasParent
            }).data('kendoTreeView');
        }
    
        function ExpandNode() {
            var treeview;
            treeview = $("#treeview").data("kendoTreeView");
            var nodeToExpand = treeview.findByText('Adam'); //dummy txt, will have from parameter
            treeview.expand(nodeToExpand);
        }
    
        function CheckIfHasParent(e) {
        }
    
        InitializeTreeview();
    
 });

и вы можете поиграть с ним здесь: http://jsfiddle.net/OnaBai/dSt2h/

person OnaBai    schedule 08.07.2013
comment
В конце концов, я решил проблему (на самом деле, я отдаю должное моему коллеге). Запустив событие щелчка по стрелке (диапазону). Что касается dataBound, я только что запустил свою функцию в точке, где treevies обязательно загружается. Фактическая задача: для любого заданного идентификатора узла развернуть древовидную структуру до этого узла и выбрать его. Поэтому я позвонил в БД, чтобы получить массив идентификаторов родителей. Чтобы дождаться загрузки каждого узла (чтобы развернуть следующий), я использовал ответ Райана Лестера: stackoverflow.com/questions/5525071/ также получил ссылку от моего коллеги - person Vlad; 10.07.2013
comment
Спасибо за ответ и за то, что нашли время отредактировать мой код. Да, и я обнаружил, что расширение не работает, если узел не был предварительно загружен. скажите, что вы открываете его, а затем закрываете. после этого все заработало. поэтому я предполагаю, что с удаленными данными вам нужно установить loadOnDemant в false. но в моем случае это неприменимо. - person Vlad; 10.07.2013
comment
Вы правы, разница между локальными данными и удаленными данными (четко указанная в документации) заключается в том, что значение по умолчанию для loadOnDemand ложно, если это не локальные данные. В SO есть еще один вопрос, связанный с древовидным представлением, где они хотят открыть два уровня один сразу за другим, но они не ждут, когда будет развернут первый ... та же проблема, то же решение (как подождать, пока элемент не существует?) - person OnaBai; 10.07.2013
comment
Если вы ответите на свой вопрос подробно, я буду поддерживать решение :-) - person OnaBai; 10.07.2013

Для всех, кому может быть интересно:

   function ExpandNode() {
    
   var treeview;
   var node1;

   treeview = $("#treeview").data("kendoTreeView");
   var node2;
   var myURL = kendo.format(websiteRootUrl + '/Merchants/GetPathForSelectedNode?databaseID={0}&merchantID={1}&brandownerID={2}', selectedDatabaseID,MerID,BowID);
       
   node1 = treeview.dataSource.get(BowID);
   node = treeview.findByUid(node1.uid);
   var uid = node1.uid;
   node.find('span:first-child').trigger('click'); //expand 1st level

   $.ajax( {
                            url: myURL,
                            dataType: "json",
                            contentType: 'application/json; charset=utf-8',
                            success: function(result)
                                {
                                   
                                   var length = result.length;
                                 
                                   var lastVal = 1;
                                   for (var i = 1; i < length-1; i++) {
                                        $("#treeview li[data-uid=\'" + uid + "\'] ul.k-group").waitUntilExists (function
                                        () {
                                               i = lastVal; // have to reinitialize i because waitUntilExist's callback will find the i incermented, over the needed value
                                               lastVal++;
                                               node2 = node1.children.get(result[i]);
                                               node = treeview.findByUid(node2.uid);
                                               uid = node2.uid;
                                               node1 = node2;
                                               if(lastVal <= length-1)
                                                    node.find('span:first-child').trigger('click'); // keep expanding
                                               else
                                               {
                                                    treeview.select(node); // just select last node
                                                    currentSelectedNode = node;
                                                }
                                            
                                        });
                                   }
                                   if(length == 2) //select 1st child
                                   {
                                        $("#treeview li[data-uid=\'" + uid + "\'] ul.k-group").waitUntilExists (function
                                        () {
                                               node2 = node1.children.get(result[i]);
                                               node = treeview.findByUid(node2.uid);
                                               uid = node2.uid;
                                               node1 = node2;
                                               treeview.select(node); // just select last node
                                               currentSelectedNode = node;
                                        });
                                   }
                                }
                          });

}

Это мой метод. Цикл for начинается с 1, потому что 1-й элемент в моем массиве - это идентификатор 1-го узла, который я уже расширил. .waitUntilExists - это метод Райана Лестера (я поместил ссылку в комментариях выше). Большое спасибо моему коллеге, вам, OnaBai, и, конечно же, Райану Лестеру. Я надеюсь, что это помогает кому-то. Ваше здоровье

person Vlad    schedule 12.07.2013

ypu может легко найти, что древовидное представление готово к расширению, используя следующий код, который расширяет все узлы древовидного представления, вы также можете найти его, проверив perticular id или текстовый переход, следующий пример поможет вам

Ex:

$("#treeview").kendoTreeView({
                animation: {
                    expand: true
                },

                dataSource: dataSource,
                dataBound: function (e) {                   
                    var tv = $("#treeview").data("kendoTreeView");
                    if (tv != null) {
                        tv.expand(".k-item");
                    }
                },

                dataTextField: "test",
                dataValueField: "id"                
            });
person Chandrika Prajapati    schedule 21.04.2014

person    schedule
comment
Пожалуйста, объясните свой ответ подробнее - person webNeat; 29.08.2014