jqGrid getLocalRow возвращает false, когда установлено свойство данных

У меня проблемы с использованием getLocalRow вместе со свойством данных

var $grid;
getGrid = function () {
    $grid = $("list");
    $grid.jqGrid({
        mtype: "POST",
        colNames: [],
        colModel: [
            ....
        ],
        pager: "",
        loadonce: true,
        multiselect: true,
        gridComplete: function () {
           var data = $(this).getDataIDs();
           for(var i=0; i < data.length;i++){
                $(this).setSelection(data[i]); // select all rows by default
           }
        },
        loadComplete: function (data) {

        },
        loadError: function (xhr) {

        }
    });
    return $grid;
};

Существует два способа заполнения сетки на основе двух сценариев.
В сценарии 1 я просто нажимаю URL-адрес сервера, возвращаю данные в формате JSON и заполняю их в сетке. Используя эту опцию, когда я перебираю выбранные строки и выполняю getLocalRow, я получаю требуемый o/p.

А в сценарии 2 я создаю объект данных и передаю его в ту же сетку. Проблема возникает здесь, когда я повторяю и использую getLocalRow в этом контексте, я получаю false для всех выбранных строк вместо данных строки, но отлично работает с getRowData.

сценарий 1:

$grid.jqGrid("clearGridData");
$grid.jqGrid("setGridParam", {url: '..', datatype: "json"}).trigger("reloadGrid");

сценарий 2:

$grid.jqGrid("clearGridData");
$grid("setGridParam", { data: MyOWNobject}).trigger("reloadGrid");        

Доступ к getLocalRow:

var sel=[];
for (i = 0; i < $grid.jqGrid("getGridParam").selarrrow.length; i++) {
    sel.push($grid.jqGrid("getLocalRow", $grid.jqGrid("getGridParam").selarrrow[i]));
}

person Faz    schedule 11.02.2016    source источник
comment
Извините, но в вашем коде нет теста data и нет colModel и непонятно, где (в какой момент) вы используете getLocalRow. Не могли бы вы подготовить демонстрацию, которую можно использовать для воспроизведения вашей проблемы.   -  person Oleg    schedule 11.02.2016
comment
@ Олег, пожалуйста, проверьте это jsfiddle.net/y9KHY/90 . Нажмите «Тест», чтобы загрузить данные, и когда вы нажмете кнопку «Тест2», getLocalRow для выбранной строки будет возвращено как false, тогда как, если я использую getRowData, все будет работать нормально.   -  person Faz    schedule 12.02.2016


Ответы (1)


Проблема в заполнении сетки. Каждая строка сетки должна быть уникальной id. Если в ваших данных уже есть какой-то столбец с уникальными данными, то можно использовать key: true в столбце, чтобы сообщить jqGrid использовать значение из столбца в качестве идентификатора строки.

В прошлый раз я тестировал бесплатный jqGrid всегда с данными, которые содержат либо свойство id в каждом столбце, либо свойство key: true для столбца, значения которого нужно использовать в качестве идентификатора строки. Если вы будете следовать правилу, то проблемы, о которой вы сообщаете, не будет. См. демонстрацию http://jsfiddle.net/OlegKi/y9KHY/92/, в которой используется код

$("#submit1").click(function () {
    var $grid = $("#gGrid");
    var grps = [
            { Name : "A",  Group : "11" },
            { Name : "B" , Group : "1122" }
        ];
    $grid.jqGrid({
        data: grps,
        colModel: [
            { name: 'Name', key: true },
            { name: 'Group' }
        ],
        cmTemplate: {width: 200},
        rownumbers: true,
        multiselect: true,
        gridComplete: function () {
            $("#cb_" + this.id).click();
        }
    });
});

$("#submit2").click(function () {
    var $grid = $("#gGrid"), p = $grid.jqGrid("getGridParam"), i;

    for (i = 0; i < p.selarrrow.length; i++) {
        alert("Data  > " + JSON.stringify($grid.jqGrid("getLocalRow", p.selarrrow[i])));
    }
});

Демо http://jsfiddle.net/OlegKi/y9KHY/93/ использует свойство id в входные данные.

Тем не менее, использование не полных входных данных, без указания rowid, в целом допускается. Таким образом, описанное выше поведение бесплатной jqGrid является ошибкой. Ошибки уже исправлены в коде бесплатного jqGrid на GitHub. Вы можете убедиться в этом в демоверсии http://jsfiddle.net/OlegKi/y9KHY/94/, который использует код непосредственно из GitHub. Я планирую опубликовать следующую версию в ближайшее время.

person Oleg    schedule 11.02.2016
comment
@Oleg: Это уже опубликовано? Я использую бесплатную jqgrid 4.13.6. Когда я отлаживаю, я вижу идентификатор каждой строки: «jqg41», «jqg42» и т. д. А иногда это «jqg61», «jqg62» и т. д. - person SK.; 16.02.2017
comment
@SKumar: идентификаторы строк будут похожи на 'jqg41, если вы заполните сетку неправильным образом (если исходные данные сетки не содержат информации об идентификаторе). Тем не менее, данные p.selarrrow[i] будут в этом случае идентификаторами строк, сгенерированными jqGrid, и код из моего ответа будет работать правильно. - person Oleg; 16.02.2017