javascript - data - requestend kendo grid
Kendo UI clear filter por campo (2)
Tengo una red kendo en mi página. Esta grilla tiene fuente de datos. Y en esta fuente de datos tengo una matriz de filtros complejos. Por ejemplo:
http://s7.postimg.org/bmqxgp2ff/filters.png
Y antes de agregar un nuevo conjunto de filtros a mis filtros de fuente de datos, necesito eliminar todos los filtros donde campo = "fld_32" por ejemplo.
Creo que es posible hacerlo por recursión, pero en la cuadrícula hay un componente de filtro que tiene el botón "borrar" y el botón borrar hace lo mismo que yo necesito. Pero no tengo idea de cómo funciona y cómo llamarlo programáticamente.
Todo lo que necesitas hacer es usar esta función. Esto borrará todos los filtros:
function clearFiter() {
$("form.k-filter-menu button[type=''reset'']").trigger("click");
}
Extiendo kendoGrid por método para borrar todos los filtros en la grilla:
kendo.ui.Grid.prototype.clearFilters = function(args){
// MODIFY THIS PART
var ignore = [];
// test arguments
if(typeof args === ''object''){
if(args.hasOwnProperty(''ignore'')){
if(args.ignore.length > 0){
ignore = args.ignore;
}
}
}
// get dataSource of grid and columns of grid
var fields = [], filter = this.dataSource.filter(), col = this.columns;
if( $.isEmptyObject(filter) || $.isEmptyObject(filter)) return;
// Create array of Fields to remove from filter and apply ignore fields if exist
for(var i = 0, l = col.length; i < l; i++){
if(col[i].hasOwnProperty(''field'')){
if(ignore.indexOf(col[i].field) === -1){
fields.push(col[i].field)
}
}
}
// MODIFY THIS PART END
if($.isEmptyObject(fields)) return;
// call "private" method
var newFilter = this._eraseFiltersField(fields, filter)
// set new filter
this.dataSource.filter(newFilter);
}
Y aquí está el segundo método. Está separado porque puede ser llamado recursivamente:
kendo.ui.Grid.prototype._eraseFiltersField = function(fields, filter){
for (var i = 0; i < filter.filters.length; i++) {
// For combination ''and'' and ''or'', kendo use nested filters so here is recursion
if(filter.filters[i].hasOwnProperty(''filters'')){
filter.filters[i] = this._eraseFiltersField(fields, filter.filters[i]);
if($.isEmptyObject(filter.filters[i])){
filter.filters.splice(i, 1);
i--;
continue;
}
}
// Remove filters
if(filter.filters[i].hasOwnProperty(''field'')){
if( fields.indexOf(filter.filters[i].field) > -1){
filter.filters.splice(i, 1);
i--;
continue;
}
}
}
if(filter.filters.length === 0){
filter = {};
}
return filter;
}
Para su problema, puede modificar el método clearFilters para tomar el argumento del nombre del campo para borrar del filtro ("fld_32"). Entonces este campo se puede insertar en el parámetro _eraseFiltersField en lugar de fileds de grilla.