free-jqGrid 4.15.6 ExpandNode, вызывающий ошибку во время выполнения - PullRequest
0 голосов
/ 11 октября 2018

Я недавно обновил jqGrid v4.5.4 от Тони Томова до free-jqGrid Олега 4.15.6.

При использовании 4.5.4 приведенный ниже код работал отлично, но в 4.15.6 он работаетне.Ошибка времени выполнения вызывается двумя вызовами expandNode и expandRow, расположенными в функции forceNodeOpen ().Полученная ошибка:

TypeError: rc1 не определено

Функция forceNodeOpen () используется для того, чтобы все узлы-предки текущего узла древовидной сетки отображались как развернутые.Во многом как оглавление ... если мы загружаем начальный узел темы, мы хотим, чтобы вся иерархия темы была расширена:

// force a node (if expandable) to stay expanded
function forceNodeOpen(rowid)
{
    var record = $("#tree").jqGrid('getRowData', rowid);
    var div = $('tr#'+rowid).find('div.ui-icon.treeclick');
    div.removeClass('ui-icon-triangle-1-e tree-plus').addClass('ui-icon-triangle-1-s tree-minus');
    **$('#tree').jqGrid('expandNode', record);**    
    **$('#tree').jqGrid('expandRow', record);**

    // get all ancestoral parents and expand them
    // *NOTE*: the getAncestorNodes function of grid was not usable for 
    //         some reason as the same code below just would not work 
    //         with the return array from getAncestorNodes
    var parent = $("#tree").jqGrid('getNodeParent', record);
    while(parent)
    {
        forceNodeOpen(parent['id']);
        parent = $("#tree").jqGrid('getNodeParent', parent);
    }
}

// using topic url, get the tree row id
function getTopicID(topic)
{
    var nodes = $('#tree').jqGrid('getRowData');
    var rowid = 1;
    $.each(nodes, function(e,i)
    {
        var url = $(this).attr('url');
        if(url == topic)
        {
            rowid = $(this).attr('id');
            return false;
        }
    });

    return rowid;
}

// post request to help server via ajax
function loadTopic(topic)
{
    // no need to load again
    if(loadedtopic == topic) { return false; }

    // select the topic node
    var rowid = getTopicID(topic);
    loading = true;
    $('#tree').jqGrid('setSelection', rowid);
    forceNodeOpen(rowid);
    loading = false;

    // wipe content
    $('h1#help_content_topic span:first').html('Loading...');
    $('div#help_content').html('');

    // block UI for ajax posting
    blockInterface();

    // request help content
    $.ajax(
    {
        type: 'POST', 
        url: '/index.php',
        data: { 'isajax': 1, 'topic': topic },
        success: function(data)
        { 
            $.unblockUI();
            $('h1#help_content_topic span:first').html(data['topic']);
            $('div#help_content').html(data['content']);
            return false;
        }
    });

    // save current topic to prevent loading same topic again
    loadedtopic = topic;
}

// table of contents
$('#tree').jqGrid({
    url: "topics.php",
    datatype: "xml",
    autowidth: true,
    caption: "Help Topics",
    colNames: ["id","","url"],
    colModel: [
        {name: "id",width:1,hidden:true, key:true},
        {name: "topic", width:150, resizable: false, sortable:false},
        {name: "url",width:1,hidden:true}
    ],
    ExpandColClick: true,
    ExpandColumn: 'topic',
    gridview: false,
    height: 'auto',
    hidegrid: false,
    pager: false,
    rowNum: 200,
    treeGrid: true,
    treeIcons: {leaf:'ui-icon-document-b'},

    // auto-select topic node
    gridComplete: function()
    {
        // save current topic to prevent loading same topic again
        loadedtopic = '<? echo($topic) ?>';
        var rowid = getTopicID('<? echo($topic) ?>');
        $('#tree').jqGrid('setSelection', rowid);
        forceNodeOpen(rowid);
        $.unblockUI();
    },

    // clear initial loading
    loadComplete: function()
    {
        loading = false;
    },

    onSelectRow: function(rowid)
    {
        // ignore initial page loads
        if(loading) { return false; }

        // load the selected topic
        var topic = $("#tree").jqGrid('getCell',rowid,'url');
        loadTopic(topic);
    }
});

forceNodeOpen (rowid) вызывается из функции loadTopic (),который вызывается внутри события onSelectRow () древовидной сетки.

Не уверен, что 4.5.4 сделал, что позволило этому коду работать, но 4.15.6 находит, что это ошибка.Оскорбляющая строка в 4.15.6.src.js:

expandNode: function (rc) { 
...
if (p.treedatatype !== "local" && !base.isNodeLoaded.call($($t), p.data[p._index[id]]) && !$t.grid.hDiv.loading) {
// set the value which will be used during processing of the server response
// in readInput
p.treeANode = rc1.rowIndex;
p.datatype = p.treedatatype;
...});

Я включил только несколько строк из вышеуказанной основной функции.Это ошибка p.treeANode = rc1.rowIndex.

Я должен что-то упустить, но не знаю что.Надеюсь, кто-нибудь может сказать мне, что делать.Если я укажу на два вызова функции дерева сетки расширений и расширений в функции forceNodeOpen (), система не выдаст ошибку и загрузится нужный раздел.Но иерархия не раскрывается должным образом.


START EDIT 1


Код на стороне сервера, который возвращает узлы тем:

echo("<?xml version='1.0' encoding='UTF-8'?>\n");

require('db.php');

echo("<rows>\n");
echo("<page>1</page>\n");
echo("<total>1</total>\n");
echo("<records>1</records>\n");

$sql = "SELECT node.id, node.parentid, node.topic, node.url, node.lft, node.rgt, (COUNT(node.parentid) - 1) AS depth 
            FROM helptopics AS node, helptopics AS parent 
                WHERE node.lft BETWEEN parent.lft AND parent.rgt
                    GROUP BY node.url ORDER BY node.lft";
$stmt = AMDB::selectStatement($sql);
while($data = $stmt->fetch(PDO::FETCH_ASSOC))
{
    $id = $data['id'];
    $pid = $data['parentid'];
    $topic = $data['topic'];
    $url = $data['url'];
    $lft = $data['lft'];
    $rgt = $data['rgt'];
    $leaf = $rgt - $lft == 1 ? 'true' : 'false';
    $exp = 'false';
    $dep = $data['depth'];

    echo("<row><cell>{$id}</cell><cell>{$topic}</cell><cell>{$url}</cell><cell>{$dep}</cell><cell>{$lft}</cell><cell>{$rgt}</cell><cell>{$leaf}</cell><cell>{$exp}</cell></row>\n");
}

echo("</rows>\n");
exit();

END EDIT 1


1 Ответ

0 голосов
/ 11 октября 2018

Я вижу, что вы используете

var record = $("#tree").jqGrid('getRowData', rowid);

для получения данных узла TreeGrid.Это не было хорошо, но это работало в старом jqGrid, потому что он сохранял внутренние данные jqGrid дважды : один раз как локальные данные и еще раз в скрытых ячейках сетки.

Вы должны использоватьgetLocalRow вместо getRowData:

var record = $("#tree").jqGrid('getLocalRow', rowid);

Код будет работать как на старой jqGrid, так и на свободной jqGrid.Кроме того, getLocalRow всегда имеет лучшую производительность по сравнению с getRowData даже в jqGrid 4.5.4.

...