Можно ли изменить обработчик событий двойного щелчка (ondblClickRow) для плагина jQuery jqGrid после его рендеринга в ASP.NET MVC? - PullRequest
1 голос
/ 21 декабря 2010

Я успешно использую jqGrid; Тем не менее, я столкнулся с чем-то, что я не могу заставить работать. Я возвращаю определение сетки как PartialViewResult через AJAX и добавляю результаты в div.

Затем я хотел бы изменить событие двойного щелчка для указанной сетки. Я использую Firebug и, кажется, могу добраться до элемента grid с помощью $('#my-grid')[0], но когда я пытаюсь вызвать методы, как показано ниже, он говорит мне, что jqGrid "не определен".

Я почти уверен, что у меня есть ссылки на jqGrid правильно, иначе я бы не зашел так далеко (я уже отображал и редактировал данные в сетках). Вот код, который получает и пытается изменить определение сетки:

    $(document).ready(function() {

        //Add the grid by pulling it via AJAX
        $.get('<%=Url.Action("Grid","Entity", new {id = "CustomerAccount"}) %>', function(htmlResult) {

            //Append grid definition to div
            $('#customer-list').append(htmlResult);
            var myGrid = $($('#CustomerAccount-grid')[0]);
            $(myGrid).jqGrid('setGridParam', { ondblClickRow: function(rowid, iRow, iCol, e) { console.log('dblclicked'); } })
                .trigger('reloadGrid');
            //NOTE: I've tried with and without the reloadGrid
}

ОБНОВЛЕНИЕ: Я думаю, что теперь я пришел к выводу, что я уверен, что я ссылаюсь на элемент как объект jQuery, что существует проблема синхронизации. Упрощенная загрузка определения сетки ниже иллюстрирует проблему:

//Append grid definition to div
$('#customer-list').load('<%=Url.Action("Grid","Entity", new {id = "CustomerAccount"}) %>',function() {

    console.log('sortname=' + $($('#CustomerAccount-grid:first')).jqGrid('getGridParam', 'sortname'));
  });

В этих журналах sortname = undefined; однако, если я скопирую и вставлю ту же строку в Firebug, она отобразит sortname = Name, что правильно.

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ: большая часть моей проблемы, возможно, заключалась в том, что я не получал элемент как объект jQuery, поэтому я приписываю drachenstern решению (спасибо!), Но однажды по той причине, что обработчик событий все еще был это не связано с тем, что определение сетки извлекалось через AJAX, и его не было, когда я пытался связать ondblclickrow. Решение было простым: я просто добавил async: false к вызову определения сетки, так что я буду знать, что определение будет всегда до того, как будут добавлены обработчики событий и т.д. Я получаю определение сетки через AJAX, потому что я динамически строю сетки на стороне сервера моего приложения ASP.NET MVC. Я все еще получаю данные для сетки асинхронно. Отлично работает сейчас.

Ответы [ 2 ]

4 голосов
/ 21 декабря 2010

Попробуйте следующий код

$('#my-grid').jqGrid('setGridParam',
                     { ondblClickRow: function(){console.log('Hello');} });

может работать во многих случаях (см. this и this ответы по той же теме), но это не работает,Проблема в том, что во время инициализации jqGrid будет проверяться, определен ли обработчик события для ondblClickRow.Если он не определен (см. исходный код ), то привязка к двойному щелчку не будет выполнена, а настройка ondblClickRow позже ничего не сделает.

Таким образом, чтобы иметь возможностьустановите ondblClickRow после завершения инициализации jqGrid, вы должны связать dblclick самостоятельно.Вы можете сделать это с помощью следующего кода:

var grid = $('#customer-list');
grid.dblclick(function(e) {
    var td = e.target;
    var ptr = $(td,grid[0].rows).closest("tr.jqgrow");
    if($(ptr).length === 0 ){return false;}
    var ri = ptr[0].rowIndex;
    var ci = $.jgrid.getCellIndex(td);
    var rowId = $(ptr).attr("id");
    alert("in ondblClickRow");
    //ts.p.ondblClickRow.call(grid[0],rowId,ri,ci, e);
    return false;
});

Комментированная строка ts.p.ondblClickRow.call(grid[0],rowId,ri,ci, e) показывает, что все входные параметры ondblClickRow у нас уже есть.

1 голос
/ 21 декабря 2010
var myGrid = $('#my-grid')[0];

Этот код устанавливает myGrid как элемент DOM.Поэтому некоторые другие элементы DOM будут:

<a>, <div>, <input>, <body>, <table>, etc

Нет собственного свойства DOM .jqGrid.Возможно, что вы хотели сделать, это получить первого ребенка, но держать его в оболочке jQuery?Есть несколько вариантов, в зависимости от желаемой читаемости.http://api.jquery.com/first/ позволяет использовать цепочку и выглядит более аккуратно, и может быть более производительным для данного случая.Также есть:

var myGrid = $( $('#my-grid')[0] );

или поочередно:

$(myGrid).jqGrid('setGridParam',{ ondblClickRow: function(){console.log('Hello');}});

и, конечно, вы можете ввести средний элемент:

var myGridTemp = $('#my-grid')[0];
var myGrid = $( myGridTemp );
myGrid.jqGrid('setGridParam',{ ondblClickRow: function(){console.log('Hello');}});

Но основная проблема заключается вПервая строка вашего примера дает только элемент DOM, а не элемент jQuery.

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