从错误处理程序中获取对 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 - 全局错误处理?