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

Posted

技术标签:

【中文标题】从错误处理程序中获取对 Kendo Grid 的引用【英文标题】:Get a reference to Kendo Grid from inside the error handler 【发布时间】:2014-01-20 02:52:08 【问题描述】:

已经有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)?这样错误处理脚本就可以完全独立了。

【问题讨论】:

【参考方案1】:

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

显然,现在可以通过e.sender.table.context.id 检索源网格。谢谢,Akbari!

剑道UI 2014.1.318

以下解决方案不起作用。数据源中似乎缺少table 成员。

我的解决方法非常粗略,只是使用选择器获取所有为.data("kendoGrid") 返回非空值的k-grid 元素,并将数据源与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,因此在上面的示例中它们应该可以互换。

【讨论】:

“警告” 应该是第一个。因为时间向前移动,而不是向后移动。 我应该补充一点,在当前版本中,它可以通过e.sender.table.context.id 访问。 自 2017.2.504(可能更早)起,table 属性已从 dataSource 中删除。可能是因为它可能被多个小部件共享。 那么@MarcL 访问它的新方法是什么? @TomelSafadi,对不起,自从那条评论(切换项目)后不久,我就没有使用过 kendo-ui。我看到我确实赞成 Atanas Korchev 的回答,这可能导致我当时找到了解决方案。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

确实,错误事件是由数据源公开的,并且无法轻易获得触发它的网格。此外,我们应该记住,一个数据源可以由多个小部件共享。

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

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


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

【讨论】:

【参考方案4】:

我知道这是旧的,但它似乎过时了。我需要在错误中访问网格的名称,因为错误来自“内部网格”(来自主网格详细信息模板中的模板)。这是来自 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)


【讨论】:

【参考方案5】:

您可以使用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);
            

【讨论】:

以上是关于从错误处理程序中获取对 Kendo Grid 的引用的主要内容,如果未能解决你的问题,请参考以下文章

Kendo UI Grid/DataSource - 全局错误处理?

在Kendo Grid中绑定时获取错误复选框

从 Kendo UI 网格过滤器和自动填充中获取价值

Telerik Kendo MVC Grid 子模板从父模板获取默认值

与 Kendo-ui Grid 反应 - 错误的列标题

Kendo Grid中的服务器端分页?