как установить postData в jqgrid ПОСЛЕ того, как он был построен?

Я генерирую jqgrid из класса модели, который передаю в поле зрения. Я создаю и работаю с jqgrid. Однако я хочу установить postData в одном представлении, где я использую jqGrid, из сценария в этом представлении после вызова помощника для создания jqgrid без необходимости изменять целое частичное представление, которое создает jqgrid.

Я пробовал бежать

$("#@Model.Id").jqGrid('setGridParam', { postData: { test: 233} });

и

$("#@Model.Id").setGridParam({ postData: { test: 233} });

но без ошибок или каких-либо результатов. Если я установил postData в параметрах jqgrid (в частичном представлении, где он построен, он работает.

Я также проверил, что сетка существует, добавил

console.log($("#@Model.Id").size());

перед первой строкой, и он показывает 1.

ОБНОВЛЕНИЕ: эта функция .setGirdParam начала работать у меня без видимой причины, поэтому я приму ответ, если кто-то может дать некоторое представление о том, что может помешать этому работать. Спасибо


person Goran Obradovic    schedule 31.05.2011    source источник


Ответы (2)


Вы не включили определение jqGrid в свой вопрос, и мы не можем увидеть место, где вызывается setGridParam. Прежде всего вы должны использовать setGridParam после создания jqGrid, но до будет отправлен запрос. Если вы измените postData , следующий запрос jqGrid может использовать новый параметр. Так что обычно используют

$("#@Model.Id").trigger('reloadGrid', [{page:1}]);

см. здесь.

Полагаю, что лучшим вариантом для вас будет использование свойства function test объекта postData в качестве функции:

$("#@Model.Id").jqGrid({
    // ... other jqGrid parameters ...
    postData: {
        test: function() {
            // the code can by dynamic, read contain of some elements 
            // on the page use "if"s and so on and return the value which 
            // should be posted to the server
            return 233;
        }
    }
    // other jqGrid parameters ...
});

См. подробности здесь. Таким образом можно реализовать практически любой сценарий.

Кстати, если вы не хотите, чтобы jqGrid отправлял какие-либо запросы на сервер, пока событие не произошло, вы можете использовать datatype:'local' во время инициализации. Затем, если вы хотите, чтобы сетка была заполнена, вы можете использовать setGridParam, чтобы изменить datatype с 'local' на 'json' (или 'xml') и вызвать .trigger('reloadGrid',...).

person Oleg    schedule 31.05.2011
comment
спасибо за часть test: function (), которая будет полезна, в противном случае я уже реализовал все в соответствии с тем, что вы написали. Сейчас работает, но не сначала и не знаю, что поменял :) - person Goran Obradovic; 31.05.2011
comment
@obrad: Вы не разместили свой код, который используете в настоящее время. Если сначала что-то не работает, вам следует сначала проверить, какой именно код работает. Я предположил, что у вас могут быть такие проблемы, и включил в свой ответ часть, в которой изначально используется datatype с 'local', что предотвратит загрузку первой сетки. После того, как станет известно значение, которое вам нужно использовать внутри test:function(), вы можете изменить datatype на 'json' и принудительно загрузить сетку с помощью .trigger('reloadGrid',...). - person Oleg; 31.05.2011
comment
Я не публиковал его, потому что он сгенерирован, но предположим, что я должен был опубликовать сгенерированный код. Однако сейчас это работает. Спасибо за помощь. - person Goran Obradovic; 31.05.2011
comment
@obrad: Пожалуйста! Я предпочитаю иметь пример кода, потому что у jqGrid слишком много параметров, и многие неважные параметры, которые не будут включены в вопрос, могут потребовать переписать решение. Например, группировка, древовидные сетки, вложенные сетки, xml или json, локальные или удаленные данные или смесь в отношении loadonce:true, 'multiselect: true', различные версии режима редактирования (ячейка, встроенное редактирование и редактирование формы) и так далее. Так что приходится угадывать или задавать много дополнительных вопросов. В любом случае ваша проблема решена, и я рад об этом читать. - person Oleg; 31.05.2011

Вот метод, который я использовал

postData: { 'testKey': function () { return 'testvals'; } },
person user2675617    schedule 05.10.2013
comment
Обертывание глобальной переменной для возврата из такой функции сработало идеально, так что триггер reloadGrid извлекал текущее значение переменной, а не значение, которое она имела при первом создании сетки. спасибо. Итак, если бы у меня был var testval, то постданные были бы такими: postData: {'testKey': function () {return testval; }}, - person John Glassman; 30.07.2015