从错误处理程序内部获取对 Kendo Grid 的引用

问题描述 投票:0回答:6

已经存在如何获得自定义错误处理的问题,以及答案,但所有这些答案都使用网格的“外部”引用/选择器来使其工作,例如:

function onError(e) {
    if (e.errors) {
        var message = "Error:\n";  

        var grid = $('#gridID').data('kendoGrid'); // <<- here
    (...)
}

是否可以从错误处理函数内部获取对网格的引用,而无需手动或“外部”提供选择器(因为全局变量是meh)?这样错误处理脚本就可以完全独立。

javascript asp.net-mvc kendo-ui kendo-grid kendo-asp.net-mvc
6个回答
15
投票

“当前”版本截至 2015 年 12 月 5 日

显然,现在可以通过

e.sender.table.context.id
检索源网格。谢谢,阿克巴里

KendoUI 2014.1.318

下面的解决方案不起作用。数据源中似乎缺少

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
,因此它们在上面的示例中应该可以互换。


11
投票

我建议将目标网格 ID 作为参数传递给您的函数。 例子: .Events(events => events.Error("function(args){telerikGridAraxErrorhandler(args,'myGridId');}"))

我认为,如果他们在未来版本的 Telerik Grid 中进行任何更改,这将导致支持减少


6
投票

事实上,错误事件是由数据源公开的,人们无法轻易获知哪个网格触发了它。我们还应该记住,一个数据源可以由许多小部件共享。

另一种可能的解决方案是使用绑定到小部件名称的闭包:

function errorHandler(gridName) {
   return function(e) {
       // handle the event.
       var grid = $(gridName).data("kendoGrid");
   };
}

$("#grid").kendoGrid({
   dataSource: {
       error: errorHandler("#grid")
   }
});

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)
{
}

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);
    }        
}

0
投票

查看调试信息并找到网格参考。 这工作得很好: var grid = $(e.delegateTarget).data("kendoGrid");

© www.soinside.com 2019 - 2024. All rights reserved.