已经有questions how to get custom error handling, with answers,但所有这些答案都使用“外部”引用/选择器来使其工作,例如:
function onError(e) {
if (e.errors) {
var message = "Error:\n";
var grid = $('#gridID').data('kendoGrid'); // <<- here
(...)
}
是否可以从错误处理函数内部获取对网格的引用,而无需手动或“外部”提供选择器(因为全局变量 meh )?这样,错误处理脚本可以完全独立。
答案 0 :(得分:15)
显然,现在可以通过e.sender.table.context.id
检索源网格。谢谢,Akbari!
下面的解决方案不起作用。似乎数据源中缺少table
成员。
我的解决方法很粗糙,只是使用选择器来获取k-grid
的所有.data("kendoGrid")
元素,这些元素返回非空值,并将数据源与arg.sender
进行比较。当数据源匹配时 - 我们有一个引发错误的网格:
$(".k-grid").each(function() {
var grid = $(this).data("kendoGrid");
if (grid !== null && grid.dataSource == args.sender) {
// We have a winner!
}
});
事实证明 - 在浏览互联网很长时间后 - 这是可能的。 所以,对于那些在将来某个时间寻找答案的人来说,甚至可能是未来的我。
在函数内部,this
未绑定到网格,而是绑定到网格内部使用的DataSource
,因此无法直接使用 来改变错误处理行为。需要一些记录不清的魔法。
这意味着(从Kendo UI MVC版本2013.3.1119.545开始)可以使用以下内容:
e.sender.options.table.context
返回包装网格(DOM元素),而
e.sender.options.table.context.id
返回网格ID。
这意味着,使用jQuery,可以通过以下方式检索网格:
var grid = $(e.sender.options.table.context).data("kendoGrid");
其余的错误处理脚本保持完全相同。
从技术上讲,范围中绑定的this
和sender
似乎都是相同的 - 网格DataSource
,因此在上面的示例中它们应该是可互换的。
答案 1 :(得分:9)
我建议将目标网格id作为参数传递给你的函数。 例: .Events(events =&gt; events.Error(“function(args){telerikGridAraxErrorhandler(args,'myGridId');}”))
我认为如果他们在Telerik Grid的未来版本中更改了任何内容,它将导致更少的支持
答案 2 :(得分:6)
实际上,错误事件是由数据源公开的,并且不能轻易地获取哪个网格触发它。此外,我们应该记住,许多小部件可以共享一个数据源。
另一种可能的解决方案是使用绑定到窗口小部件名称的闭包:
function errorHandler(gridName) {
return function(e) {
// handle the event.
var grid = $(gridName).data("kendoGrid");
};
}
$("#grid").kendoGrid({
dataSource: {
error: errorHandler("#grid")
}
});
答案 3 :(得分:0)
我知道这很旧,但似乎已经过时了。我需要在错误中访问网格的名称,因为该错误来自“内部网格”(来自主网格详细模板中和内部的模板)。这是来自Telerik论坛的,所以我不想为此功劳,但是花了我一些时间才找到它,所以我在这里分享。 对于剃刀助手,
@Html.Kendo().Grid<Model>()
.DataSource(dataSource => dataSource
.Events(events => events.Error("function(e){error_handler(e, 'GridName')"}))
对于Jquery:
$("#Promotions").kendoGrid({
dataSource: {
error: errorHandler("#Promotions")
}
});
和Javascript函数
Function error_handler(e, GridName)
{
}
答案 4 :(得分:0)
您可以使用Error()
事件的重载方法并将网格名称作为参数传递
喜欢:
...
.Events(events => events.Error("function(e){error_handler(e, '#grid')}"))
javascript方法:
function error_handler(e, gridName) {
$(gridName).data("kendoGrid").cancelChanges();
if (e.errors) {
var message = "Errors:\n";
$.each(e.errors, function (key, value) {
if ('errors' in value) {
$.each(value.errors, function () {
message += this + "\n";
});
}
});
alert(message);
}
}