Ссылка из значения столбца в jqGrid на новую страницу с помощью GET - PullRequest
7 голосов
/ 16 февраля 2011

Я создал jqGrid, который содержит некоторые поля, такие как:

job_id, имя и т. Д.

Я пытаюсь сделать так, чтобы при щелчке по значению в столбце job_id он перенаправлял их на:

job.php? Job_id = (значение, на которое они нажали)

Я начал с попытки использовать следующее в качестве моей colModel:

{ name:'job_id', index:'job_id', edittype:'select', formatter:'showlink',
  formatoptions:{baseLinkUrl:'job.php'}, width:50, align:'center' }

Но что это приводит к перенаправлению на:

job.php? Job_id = (row_id)

Я провел некоторый поиск и нашел пост разработчика версии этого программного обеспечения с открытым исходным кодом, который предложил использовать следующую colModel и дополнительный JS:

{ name:'job_id', index:'job_id', edittype:'select', formatter:'showlink',
  formatoptions:{baseLinkUrl:'#'}, width:50, align:'center' }

loadComplete: function() {
    var myGrid = $("#home_list");
    var ids = myGrid.getDataIDs();
    for (var i = 0, idCount = ids.length; i < idCount; i++) {
        $("#"+ids[i]+" a",myGrid[0]).click(function(e) {
            var hash=e.currentTarget.hash;// string like "#?id=0"
            if (hash.substring(0,5) === '#?id=') {
                var id = hash.substring(5,hash.length);
                var text = this.textContent;
                location.href="job.php?id="+text;
            }
            e.preventDefault();
        });
    }   
}

Но это не совместимо с IE. Кроме того, при отображении большого количества строк в jqGrid загрузка занимает очень много времени, например, 5 секунд + для 500 строк.

Я собираюсь продолжать работать над этим, но разве это кто-то еще сделал?

1 Ответ

7 голосов
/ 16 февраля 2011

Вы использовали пример кода из моего старого ответа , поэтому я решил, что должен ответить на ваш вопрос.

Я согласен с критиком по поводу исполнения кода loadComplete.Так что +1 от меня за ваш вопрос.Конструкция $("#"+ids[i]+" a", myGrid[0]) внутри длинной петли может работать очень медленно.Можно легко решить проблему, если использовать следующее

var getColumnIndexByName = function (columnName) {
    var cm = $(this).jqGrid("getGridParam", "colModel"), l = cm.length, i;
    for (i = 0; i < l; i++) {
        if (cm[i].name === columnName) {
            return i; // return the index
        }
    }
    return -1;
};

var myGrid = $("#list");
myGrid.jqGrid({
    ...
    loadComplete: function () {
        var i = getColumnIndexByName.call(this, 'Subcategory');
        // nth-child need 1-based index so we use (i+1) below
        $("tbody>tr.jqgrow>td:nth-child(" + (i+1) + ")>a", this).click(function (e) {
            var hash=e.currentTarget.hash;// string like "#?id=0"
            if (hash.substring(0,5) === '#?id=') {
                var id = hash.substring(5, hash.length);
                var text = this.textContent || this.innerText;
                alert("clicked the row with id='"+id+"'. Link contain '"+text+"'");
                location.href = "http://en.wikipedia.org/wiki/" + text;
            }
            e.preventDefault();
        });
    }
});

. Вы можете видеть, что улучшенная версия демо работает точно так же, как оригинальная демка .Чтобы показать производительность метода на 1000 строк, я создал еще одну демонстрацию .Видно, что новый метод работает быстро.

Теперь вернемся к вашей основной проблеме.Наилучшую производительность мы получим, если вы напишите свой пользовательский форматер и unformatter вместо использования предопределенного форматера showlink .Код может быть примерно следующим:

formatter: function (cellvalue, options, rowObject) {
    return "<a href=\"job.php?job_id=" + rowObject.job_id + "\">" + cellvalue + "</a>";
},
unformat: function (cellvalue, options, cellobject) {
   return cellobject.job_id;
}

Точный код зависит от того, какой datatype вы используете, используете ли вы loadonce:true или нет и какой jsonReader вы используете.Например, rowObject - это массив в вашем случае, и вы должны использовать индекс массива соответствующего поля данных (например, rowObject[4]) вместо rowObject.job_id.

UPDATED : Я думаю, что лучшим способом реализации будет использование onCellSelect или beforeSelectRow вместо привязки события click к каждому элементу в столбце.Я рекомендую прочитать следующие ответы для деталей: этот , еще один и еще один старый ответ .

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