Проблема с автоматической загрузкой дерева jqGrid. .

#jqgrid #tree #autoload #treegrid

#jqgrid #дерево #автозагрузка #treegrid

Вопрос:

У меня проблема с автозагрузкой древовидной сетки. В настоящее время у меня есть структура глубиной всего 2 уровня.

 1
    a
    b
    c 
2
    a
  

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

 1
1
    a
    b
    c
  

Вот посмотрите на XML перед выбором корневого узла:

 <?xml version="1.0" encoding="UTF-8"?>
<rows>
    <page>1</page>
    <total>1</total>
    <records>1</records>
    <row>
        <cell>1112</cell>
        <cell>Parent 1</cell>
        <cell>0</cell>
        <cell>NULL</cell>
        <cell>false</cell>
        <cell>false</cell>
    </row>
</rows>
  

И вот посмотрите на XML после выбора корневого узла:

 <?xml version="1.0" encoding="UTF-8"?>
<rows>
    <page>1</page>
    <total>1</total>
    <records>1</records>
    <row>
        <cell>1112</cell>
        <cell>Parent 1</cell>
        <cell>0</cell>
        <cell>NULL</cell>
        <cell>false</cell>
        <cell>false</cell>
    </row>
    <row>
        <cell>5207</cell>
        <cell>Child 1</cell>
        <cell>1</cell>
        <cell>1112</cell>
        <cell>false</cell>
        <cell>false</cell>
    </row>
</rows>
  

Кроме того, вот моя конфигурация:

 $(document).ready(function(){
    $("#gReport").jqGrid({
        treeGrid: true,
        treeGridModel: 'adjacency',
        ExpandColumn: 'company',
        url: document.forms['frmReport'].elements['gaddr'].value,
        datatype: 'xml',
        mtype: 'GET',
        colNames: ["ID", "Company"],
        colModel: [
            {name: 'id', index: 'id', width: 1, hidden: true, key: true},
            {name: 'company', index: 'company', width: 40, hidden: false, sortable: true}
        ],
        rowNum: -1,
        width: 980,
        height: 'auto',
        pager: false,
        caption: ''
    }),
});
  

Мы были бы очень признательны за любую помощь.
Спасибо.
-крис

Ответ №1:

Поведение, которое вы описали, действительно забавно! Проблема в том, что дочерний узел «Child 1» не помечен как конечный (строка <cell>false</cell> после <cell>1112</cell> является значением isLeaf). Таким образом, после того, как пользователь нажмет на «Дочерний элемент 1», должны быть показаны все его дочерние элементы. Поскольку значение для столбца «загружено» не определено в ваших входных данных, древовидная сетка пытается загрузить дочерние узлы узла «Child 1» с id = 5207 с сервера. Итак, запрос на тот же URL с дополнительными параметрами

nodeid = 5207 amp;parentid = 1112 amp;n_level = 1

будет выполнено. Поскольку ваш сервер просто игнорирует параметры и возвращает те же XML-данные, вы видите сумасшедшую картинку

введите описание изображения здесь

(Смотрите демонстрацию здесь). Чтобы устранить проблему, вы должны либо пометить узел «Дочерний 1» как конечный:

 <row>
    <cell>5207</cell>
    <cell>Child 1</cell>
    <cell>1</cell>
    <cell>1112</cell>
    <cell>true</cell> <!-- here the "false" was changed to "true" -->
    <cell>false</cell>
</row>
  

и получите следующую древовидную сетку

введите описание изображения здесь

(смотрите демонстрацию здесь) или добавьте дополнительные данные в XML-файл для столбца «loaded» со значением «true»:

 <row>
    <cell>1112</cell>
    <cell>Parent 1</cell>
    <cell>0</cell>
    <cell>NULL</cell>
    <cell>false</cell> <!-- is leaf -->
    <cell>true</cell>  <!-- should be expanded -->
    <cell>true</cell>  <!-- is loaded -->
</row>
<row>
    <cell>5207</cell>
    <cell>Child 1</cell>
    <cell>1</cell>
    <cell>1112</cell>
    <cell>false</cell> <!-- is leaf -->
    <cell>false</cell> <!-- should be expanded -->
    <cell>true</cell>  <!-- is loaded -->
</row>
  

и получите сетку

введите описание изображения здесь

(смотрите демонстрацию здесь). Я бы рекомендовал вам любым способом включить значение «true» для столбца «loaded». Дополнительным преимуществом, которое вы получаете, является то, что вы сможете расширять любой узел во время загрузки. Например, в последней демонстрации я установил значение «true» в столбце «expanded» для корневого узла, поэтому он будет расширен во время загрузки.

Комментарии:

1. Спасибо за ваш ответ. Я добавил дополнительное поле, которое вы предложили для «загружено». Таким образом, при первой загрузке поле выдает значение false. При щелчке родительского элемента для расширения поля отображается значение true, однако это заканчивается тем же поведением. У меня родительский элемент повторяется, но со вторым экземпляром, показывающим дочерний элемент под ним. Также я не могу пометить первого дочернего элемента как конечный, потому что этот второй уровень также можно расширять (моя структура имеет глубину в 3 уровня). Есть идеи?

2. @cra: Вам следует просто добавить <cell>true</cell> в конце все <row> элементы вашего XML-файла. Это означает, что все узлы имеют «true» как свойство «loaded». Это означает, что XML-файл содержит полные данные и никаких дополнительных запросов к серверу отправлять для извлечения дочерних заметок не следует.

3. Еще раз спасибо за ваш ответ. Когда я добавляю <cell>true</cell> в конец каждого узла, родительский узел больше не будет вызывать другой запрос к серверу. Это означает, что он не получит информацию о дочерних элементах обратно. Должно быть, я чего-то здесь не понимаю. Я использую Fiddler для просмотра HTTP-запросов, и я вижу первоначальный запрос (и XML-ответ) при загрузке страницы, которая затем, конечно, загружает корень как свернутый. Однако, когда я нажимаю на корневой узел, чтобы развернуть и предоставить доступ к его дочерним элементам, на сервер не отправляется запрос о дочерней информации. Что я делаю не так?

4. Кроме того, после повторного прочтения вашего ответа я думаю, возможно, я что-то недопонял. Я надеюсь на следующее поведение. Все корневые узлы загружаются по первому запросу. При расширении узла выполняется дополнительный запрос для извлечения дочерних узлов для узла, который был только что расширен. Это необходимо, потому что набор данных довольно большой и нет необходимости возвращать гигантский XML-файл для каждого узла, если это можно сделать при расширении каждого узла. Это то, для чего, как я думал, предназначена функция «автоматической загрузки»?

5. @cra: Только сейчас вы описали, что вам нужно динамически предоставлять список дочерних заметок при расширении узла . Это означает, что вам, конечно, не следует добавлять свойство «loaded» к «Дочернему 1» узлу. Вместо этого вам следует исправить код вашего сервера, чтобы он анализировал nodeid , parentid а n_level входные параметры и выдавал правильные данные, которые содержат только узлы, являющиеся дочерними элементами nodeid узла.