【问题标题】:How to get kendoGrid id from DataSource event handler?如何从 DataSource 事件处理程序中获取 kendoGrid id?
【发布时间】:2018-03-06 15:40:12
【问题描述】:

我在 razor 视图 (MVC4) 中定义了一个剑道网格,并且我还有 dataSource 事件处理程序 - onRequestStart 像这样:

function onRequestStart(e){
     var gridId = e.sender...   //the rest of the code
}

我要做的是在函数内部获取gridId,而不将其作为参数传递给该函数。我也试过了:

e.sender.element.closest('[data-role="grid"]');

和:

e.sender.options.table.context.id //('e.sender.options.table' is null)

但它不起作用! Kendo版本2016.1.226

【问题讨论】:

  • 一个数据源可以连接到多个网格。如果您需要特定的网格,请使用声明网格的剃刀代码中指定的名称。所以对于Html.kendo().Grid<modelClass>().Name("myGrid")...,onRequestStart 将有grid_component = $("#myGrid").data('kendoGrid');
  • 是的,但我正在为应用程序中的每个网格开发一种动态方法。这就是我需要从 dataSource 中获取 gridId 信息的原因。
  • 我认为 kendo 小部件中的“监听/处理”概念是通过让它们将关联数据源的更改事件绑定到引用小部件的匿名函数来完成的。这种匿名性使得“获取听众名单”的过程比听起来更棘手。如果您检查数据源的 ._events 属性,它将是一个绑定到它的事物数组。动态的本质是什么,您需要在请求开始时了解使用数据源的网格?
  • 我想在所有“读取”请求开始时显示自定义数据加载器,并在 dataBound 结束后隐藏它。这通常应该在每个网格的一个函数中全局完成。
  • @DzananBegovic 您能否花点时间查看答案,看看它是否能解决您的问题?

标签: jquery asp.net-mvc kendo-ui


【解决方案1】:

您可以像这样创建一个自定义网格小部件,如果您一次不使用多个网格,可以添加附加的网格。

这里是它的道场。 https://dojo.telerik.com/OSovidOy

<div id="my-grid"></div>
  <script>

    var CustomGrid = kendo.ui.Grid.extend({
        options: {
            name: 'CustomGrid'
        },
        _dataSource: function() {
          kendo.ui.Grid.fn._dataSource.call(this);
          this.dataSource.attachedGrid = this;
        }
    });

    kendo.ui.plugin(CustomGrid);

    $('#my-grid').kendoCustomGrid({
        dataSource: {
          requestStart: function(e) {
                console.log(e.sender.attachedGrid);
                var gridId = e.sender.attachedGrid.element.attr('id');
          },
          data: [
            { id: 1, fullname: 'David Lebee' }, 
            { id: 2, fullname: 'Chuck Norris' } 
          ]
        }
    });
  </script>

如果你问我,更不干净,但由于你使用的是 CSharp 构建器,我怀疑你想继承他们的流利的构建器(不得不经历一次这个麻烦)。

您可以像这样通过自己的小部件类覆盖网格。

这里又是道场:

https://dojo.telerik.com/ISUxAWoj

<div id="my-grid"></div>
  <script>

    var originalDataSourceMethod = kendo.ui.Grid.fn._dataSource;

    var overrideGrid = kendo.ui.Grid.extend({
        _dataSource: function() {
          originalDataSourceMethod.call(this);
          this.dataSource.attachedGrid = this;
        }
    });

    kendo.ui.plugin(overrideGrid);

    $('#my-grid').kendoGrid({
        dataSource: {
          requestStart: function(e) {
                console.log(e.sender.attachedGrid);
                var gridId = e.sender.attachedGrid.element.attr('id');
          },
          data: [
            { id: 1, fullname: 'David Lebee' }, 
            { id: 2, fullname: 'Chuck Norris' } 
          ]
        }
    });
  </script>

【讨论】:

    【解决方案2】:

    基于 cmets,配置网格数据绑定和要为其显示内容的每个网格的 dataBound 事件可能是最简单的。

    所以,在.cshtml中

    @(Html.Kendo().Grid<grid-1-model-class>()
      .Name("grid1")
      .Events(events => {
         events.DataBinding("commonDataBinding");
         events.DataBound("commonDataBound");
      })
      .DataSource (...)
      .Columns(...)
      ...
    )
    
    @(Html.Kendo().Grid<grid-2-model-class>()
      .Name("grid2")
      .Events(events => {
         events.DataBinding("commonDataBinding");
         events.DataBound("commonDataBound");
      })
      .DataSource (...)
      .Columns(...)
      ...
    )
    
    <script>
    function commonDataBinding(e) {
      // going for data
    }
    function commonDataBound(e) {
      // data is gotten
    }
    </script>
    

    e.sender 将是剑道网格组件。

    【讨论】:

    • 是的,您的解决方案看起来不错。我已经尝试过这种方法,但我目前正在研究已经实现这两种方法的解决方案,所以我在这个方法中的代码没有我预期的行为。无论如何,感谢您的帮助,看来我需要为这个问题找到另一种解决方案。
    • 数据源上的事件呢?它将提供数据源的参考。
    猜你喜欢
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 2010-12-16
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多