jqGrid всегда выделяет первую строку при использовании addRowData - PullRequest
1 голос
/ 16 августа 2011

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

Мой код выглядит следующим образом:

function showSearchResults(k1,k2,k3,k4,k5){

jQuery("#list2").jqGrid(    {   datatype: function(pdata) {
        getData(pdata,k1,k2,k3,k4,k5);
    },
                            colNames:['title','section','Year','Month', 'Page', 'rank', k1,k2,k3,k4,k5],
                            colModel:[
                                        {name:'title',index:'title', width:300},
                                        {name:'section',index:'section', width:100},                                    
                                        {name:'yearEdition',index:'yearEdition', width:60, align:"center"},
                                        {name:'monthEdition',index:'monthEdition', width:60, align:"center"},
                                        {name:'pageNumber',index:'pageNumber', width:60, align:"center"},
                                        {name:'rank',index:'rank', width:100, align:"center"},
                                        {name:'keyword1',index:'keyword1', width:100, align:"center"},
                                        {name:'keyword2',index:'keyword2', width:100, align:"center"},
                                        {name:'keyword3',index:'keyword3', width:100,align:"center"},
                                        {name:'keyword4',index:'keyword4', width:100,align:"center"},
                                        {name:'keyword5',index:'keyword5', width:100,align:"center"}
                                    ],
                            rowNum:10,
                            rowList:[10,20,30],
                            pager: '#pager2',
                            sortname: 'id',
                            viewrecords: true,
                            sortorder: "desc",
                            loadonce:true,
                            caption:"Results" });

jQuery("#list2").jqGrid('navGrid','#pager2',{edit:false,add:false,del:false});

Функция GetData просто так:

function getData(pdata,keyword1,keyword2,keyword3,keyword4,keyword5) {

$.getJSON('addresshere?callback=?',
    {
        k1:keyword1,
        k2:keyword2,
        k3:keyword3,
        k4:keyword4,
        k5:keyword5,
        async:false
    },

    function (data) {
    var a = JSON.parse(data);

    if (a.length != 0)  {
        $.each(a, function (index, item)
                        {
                        var thegrid = jQuery("#list2"); 
                        thegrid.addRowData(0,item);
                        });
                        }
                    });
    }

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

Есть ли какие-либо очевидные или известные проблемы (например, имена полей, конфликтующие с кодом jsGrid и т. Д.).

1 Ответ

3 голосов
/ 16 августа 2011

Да, когда вы говорите:

thegrid.addRowData(0,item);

Вы присваиваете каждой строке в сетке один и тот же идентификатор 0.

Из документации на addRowData:

Параметры

  • ROWID
  • данные
  • позиция
  • srcrowid

Описание

Вставляет новую строку с id = rowid, содержащую данные в данных (объект) в указанной позиции (сначала в таблице, последней в таблице или до или после строки, указанной в srcrowid) ...

Этот метод может вставлять несколько строк одновременно. В этом случае параметр данных должен быть массивом, определенным как [{name1: value1, name2: value2…}, {name1: value1, name2: value2…}] и первый параметр rowid должны содержать имя из объекта данных, которое должно выступать в качестве идентификатора строки. Нет необходимости, чтобы имя rowid в этом случае было частью colModel.

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

 thegrid.addRowData(item.id, item);

Очевидно, что это проблема, если у вас нет уникального идентификатора на бэкэнде - хотя это может указывать на большую проблему дизайна. В любом случае, если вы не можете получить переменную ID, я предлагаю вам использовать временную переменную JavaScript, чтобы назначать каждой строке постоянно увеличивающийся ID:

var counter = 0;
...
    thegrid.addRowData(counter, item);
    counter++;
...

<час /> Обновление

Как указывает Олег, вы также можете передать undefined в качестве идентификатора, чтобы jqGrid автоматически генерировал уникальный идентификатор. Это можно увидеть из соответствующей части исходного кода в grid.base.js:

if(typeof(rowid) != 'undefined') { rowid = rowid+"";}
else {
    rowid = $.jgrid.randId();
    ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...