【问题标题】:Get a reference to Kendo Grid from inside the error handler从错误处理程序中获取对 Kendo Grid 的引用
【发布时间】: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)?这样错误处理脚本就可以完全独立了。

【问题讨论】:

    标签: javascript asp.net-mvc kendo-ui kendo-grid kendo-asp.net-mvc


    【解决方案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);
              }        
          }
          

          【讨论】:

            猜你喜欢
            • 2022-09-23
            • 1970-01-01
            • 2013-08-25
            • 2013-03-08
            • 2012-05-26
            • 2015-09-02
            • 1970-01-01
            • 1970-01-01
            • 2013-05-06
            相关资源
            最近更新 更多