Get a reference to Kendo Grid from inside the error handler
Version 'current' as of 2015-12-05
Apparently, the source grid can now be retrieved via e.sender.table.context.id
. Thanks, Akbari!
KendoUI 2014.1.318
Solution below won't work. It seems that table
member is missing from data source.
My workaround was quite crude, just using selectors to grab all k-grid
elements which return not-null for .data("kendoGrid")
and compare the data sources with arg.sender
. When the data sources match - we have a grid which raised the error:
$(".k-grid").each(function() {
var grid = $(this).data("kendoGrid");
if (grid !== null && grid.dataSource == args.sender) {
// We have a winner!
}
});
Original answer
Turns out - after browsing the Internet for quite a bit - that it is possible. So here it goes, for anyone searching for the answer sometime in the future, maybe even future-me.
Inside the function, this
is not bound to a grid, but to a DataSource
that the grid uses internally, so it can't really be used directly to alter the error-handling behavior. A little bit of poorly documented magic is needed.
It means that (as of Kendo UI MVC version 2013.3.1119.545) the following can be used:
e.sender.options.table.context
to return the wrapping grid (DOM element), while
e.sender.options.table.context.id
returns grid's ID.
It means that, with jQuery, the grid can be retrieved by:
var grid = $(e.sender.options.table.context).data("kendoGrid");
And the rest of the error-handling script remains exactly the same.
Technically, both this
bound in the scope and sender
seem to be the same thing - grid's DataSource
, so they should be interchangeable in the example above.
I would suggest passing the target grid id as an argument to your function. Example: .Events(events => events.Error("function(args){telerikGridAraxErrorhandler(args,'myGridId');}"))
I think it will result in less support in case they change anything in future versions of Telerik Grid
Indeed the error event is exposed by the data source and one can't easily get which grid triggered it. Also we should keep in mind that one data source can be shared by many widgets.
Another possible solution is to use a closure bound to the widget name:
function errorHandler(gridName) {
return function(e) {
// handle the event.
var grid = $(gridName).data("kendoGrid");
};
}
$("#grid").kendoGrid({
dataSource: {
error: errorHandler("#grid")
}
});