Okay, więc w skrócie, co muszę zrobić, to automatycznie zastosować zestaw kryteriów sortowania i filtrów danych do jqGrid podczas ładowania. Chodzi o to, że użytkownik rozpocznie od około 10 wstępnie wypełnionych filtrów, a następnie, jeśli tak zdecydują, może zmienić te filtry lub sortowanie według własnego uznania.Potrzebuję sme pomóc automatyzacji filtrów jqGrid, proszę
tej pory z wielkim Google-ing, metodą prób i błędów, a potem, mam następujący robocza:
-> mogę załadować/zapisać sortowania kolumna & porządek w pliku cookie sesji.
-> Mogę wczytać okno wyszukiwania ze wstępnie zdefiniowanymi filtrami wyszukiwania. Po załadowaniu siatki mogę otworzyć modalne okno dialogowe i zobaczyć odpowiednie filtry, a jeśli kliknę "Znajdź", odpowiednie dane zostaną wysłane na serwer, a odpowiednie wyniki zostaną zwrócone na ekran.
To, co mnie teraz gryzie w tyłek, jest, jak sądzę, częścią łatwą, ale mi to wymyka. Nie mogę wykonać jednej z poniższych czynności:
(A) Idealną rzeczą byłoby, gdybym mógł dołączyć te filtry do siatki i danych pocztowych przed początkowym załadowaniem, tak aby był tylko jeden wycieczka na serwer.
(B) Rozwiązaniem praktycznym, choć mniej idealnym, byłoby najpierw załadowanie pierwszej strony niefiltrowanych danych, a następnie zastosowanie filtrów i ponowne zapytanie serwera o przefiltrowane dane.
Ponieważ mogę ręcznie kliknąć przycisk "znajdź" już dziś i działa, myślałem, że "B" będzie dobrym następnym krokiem. Tak więc, w mojej funkcji gridComplete, mam następujący kod:
$('#AccountGrid').clearFilter({gridName:'AccountGrid', pagerName:'AccountPager'});
$('#AccountGrid').addFilter({gridName:'AccountGrid', field:'AccountID', data:1, op:'ne'});
$('#AccountGrid').addFilter({gridName:'AccountGrid', field:'AccountID', data:3, op:'ne'});
// $('#fbox_AccountGrid').searchFilter().search();
// $('#fbox_AccountGrid .ui-search').click();
$('#AccountGrid').trigger('reloadGrid');
NOTE: "clearFilter" and "addFilter" are extension functions I have added to jqGrid to simplify adding and removing filters on the grid. They work exactly as desired at this point.
As you can see with those last three lines of code, I have tried using the built-in function, as well as going after the find button directly and even just forcing the entire grid to refresh. Either way, there is no attempt by the grid to go get new data (I am using Fiddler to watch for it).
What am I doing wrong in trying to force the grid to reload with the new filters?
And, if you know how, can you give me some direction on how to get the initial load of the grid to respect these filters?
TIA
Tony
Here is the full grid configuration (minus the extra columns and some colModel "cruft"):
jQuery('#AccountGrid').jqGrid({
url: '<my URL>',
width: 950,
height: 330,
shrinkToFit: 'true',
datatype: 'json',
mtype: 'POST',
multiselect: true,
multiboxonly: true,
multiselectWidth: 20,
colNames: [
'Account ID'
],
colModel: [
{ name: 'AccountID', index: 'AccountID', sortable: false, hidden:false, search:true }
],
gridComplete: function() {
// add the search criteria to the grid
if (initialLoad == true){
$('#AccountGrid').clearFilter({gridName:'AccountGrid', pagerName:'AccountPager'});
$('#AccountGrid').addFilter({gridName:'AccountGrid', field:'AccountID', data:1, op:'ne'});
$('#AccountGrid').addFilter({gridName:'AccountGrid', field:'AccountID', data:3, op:'ne'});
// $('#fbox_AccountGrid').searchFilter().search();
// $('#fbox_AccountGrid .ui-search').click();
$('#AccountGrid').trigger('reloadGrid');
initialLoad = false;
}
},
jsonReader: {
repeatitems: false,
id: 'AccountID'
},
pager: jQuery('#AccountPager'),
rowNum: 50,
rowList: [10, 15, 25, 50, 75, 100],
onSortCol : function (sortname, indexColumn, sortorder){
$.cookie('AccountGrid_sortname', sortname);
$.cookie('AccountGrid_sortorder' , sortorder);
},
sortname : $.cookie('AccountGrid_sortname') ? $.cookie('AccountGrid_sortname') : 'AccountID',
sortorder: $.cookie('AccountGrid_sortorder') ? $.cookie('AccountGrid_sortorder') : 'asc',
viewrecords: true,
imgpath: ''
});
$('#AccountGrid').jqGrid('navGrid','#AccountPager',
{ view: false, add: false, edit: true, del: false,
alertcap:'No Account Selected',
alerttext: 'Please select an Account from the grid before performing this operation.',
editfunc: showAccountEditDialog },
{}, // default settings for edit
{}, // default settings for add
{}, // delete
{closeOnEscape: true, multipleSearch: true, closeAfterSearch: true }, // search options
{}
);
, a co za wniosek, Oto kod mam dla ADD/Usuń filtry:
/*
This is a grid extension function that will insert a new filter criteria
on the specified grid with the provided field, operation & data values
*/
(function ($) {
jQuery.jgrid.addSearchFilter =
{
// get/set the parameters
addFilter: function (options) {
var grid = $(this);
// get offset values or assign defaults
var settings = $.extend({
gridName: '',
field: '',
data: '',
op: ''
}, options || {});
// get the column model object from the grid that matches the provided name
var colModel = grid.getGridParam('colModel');
var column;
for (var i = 0; i < colModel.length; i++) {
if (colModel[i].name == options.field){
column = colModel[i];
break;
}
}
colModel = null;
if (column){
// if the last filter has a value, we need to create a new one and not overwrite the existing ones
if ($('#fbox_' + options.gridName + ' .sf .data input').last().val()){
$('#fbox_' + options.gridName).searchFilter().add();
}
// assign the selections to the search dialog
$('#fbox_' + options.gridName + ' .sf .fields select.field').last().val(column.index).change();
$('#fbox_' + options.gridName + ' .sf .data input').last().val(options.data);
$('#fbox_' + options.gridName + ' .sf .ops select.default').last().val(options.op).change();
}
}
}
})(jQuery);
jQuery.fn.extend({ addFilter: jQuery.jgrid.addSearchFilter.addFilter });
/*
This is a grid extension function that will clear & reset the filter criteria
*/
(function ($) {
jQuery.jgrid.clearSearchFilter =
{
// get/set the parameters
clearFilter: function (options) {
var grid = $(this);
// get offset values or assign defaults
var settings = $.extend({
gridName: '',
pagerName: ''
}, options || {});
// clear the filters and "pop" the dialog to force the HTML rendering
$('#fbox_' + options.gridName).searchFilter().reset();
$('#' + options.pagerName + ' .ui-icon-search').click();
$('#fbox_' + options.gridName).searchFilter().close();
}
}
})(jQuery);
jQuery.fn.extend({ clearFilter: jQuery.jgrid.clearSearchFilter.clearFilter });
Dzięki, Oleg. Dodałem definicję siatki. Pierwotnie pominąłem go, ponieważ faktyczna funkcjonalność definiowania i przypisywania filtrów wyszukiwania działała poprawnie i jeśli klikniesz przycisk "znajdź" ręcznie, działają one zgodnie z oczekiwaniami, więc z tych informacji założyłem, że moja siatka została poprawnie skonfigurowana. Ale masz rację, powinienem to uwzględnić niezależnie. – Tony
Niektóre z podanych przez ciebie linków widziałem, a niektóre nie. Jednak gdy patrzę na nie, koncentrują się na tym, jak uruchomić wyszukiwanie. Ta część, trudna część, już zrobiłem. To tylko ponowne załadowanie siatki i/lub wstępne załadowanie kryteriów wyszukiwania, których nie byłem w stanie przykuć. Twoja sugestia ustawienia typu danych, a następnie filtry i resetowanie typu danych jest interesująca. Dam ci to dziś rano. – Tony
Próbowałem twojej sugestii, aby najpierw ustawić typ danych na "lokalny", a następnie zastosować filtry i przywrócić typ danych do "json", a następnie wywołać sieć przeładowania. Pierwszy problem polega na tym, że filtry nie są stosowane do siatki, gdy siatka znajduje się w tym trybie. Nie sprawdziłem jeszcze, ale albo nie można zastosować filtrów, gdy typ danych jest "lokalny", albo zmiana typu danych powoduje wyczyszczenie filtrów. Niezależnie od tego, drugi problem polega na tym, że kiedy używam Fiddlera do przeglądania żądań przeglądarki, siatka nigdy nie oddzwania do serwera w poszukiwaniu danych, nawet po ustawieniu typu danych na json i ponownym załadowaniu siatki. – Tony