【问题标题】:How to detect that grid rows have been created in a Kendo UI Grid?如何检测在 Kendo UI Grid 中创建的网格行?
【发布时间】:2013-12-30 19:41:44
【问题描述】:

我正在使用从异步调用加载的 Kendo UI Grid 对象(Javascript 版本)。行是从为每行定义多个按钮的行模板创建的 - 这些是纯 HTML INPUT 元素 - 所有处理它们的代码都在单独的 Javascript 文件中。

创建网格时(即所有TR 元素已由Grid 控件在DOM 中创建)我需要遍历所有行并将事件处理程序附加到各种按钮并更新一些他们的属性。我的问题是我无法弄清楚网格何时创建了 DOM 元素(TR-s)。我尝试使用 dataBound 触发的事件,但尚未创建网格 DOM - 只能操作响应数据。我也尝试了detailInit 事件,但它没有被触发(我并不感到惊讶 - 网格没有细节项)。

我找到了this Telerik forum,Telerik 代表建议使用setTimeout() 来轮询元素是否存在于 DOM 中。我很难相信这个有问题的解决方案是应该作为回调构建到网格中的唯一方法。

所以我的问题是,有没有一种可靠的方法可以检测刷新后网格 DOM 何时准备就绪?或者,有没有办法检测每个TR 元素的创建(一个一个)?

编辑

添加代码:

var oDataSource =
{
    type : "odata",
    error : function ( oEvent )
    {
        // show error
    },
    transport :
    {
        read :
        {
            url : "http://url.com/...",
            dataType : "json"
        }
    },
    schema :
    {
        data : function ( oData )
        {
            return ( oData["value"] );
        },
        total : function ( oData )
        {
            return ( oData["odata.count"] );
        },
        model :
        {
            fields :
            {
                /* Model definition */
            }
        },
        pageSize : 15,
        serverPaging : true,
        serverFiltering : true,
        serverSorting : true
    }
};

var oGridSettings =
{
    dataSource : oDataSource,
    rowTemplate : kendo.template ( $( "#detail-row-template" ).html () ),
    sortable : true,
    pageable : true,
    columns :
    [
        /* Column definitions */
    ]
};

oDiv.kendoGrid ( oGridSettings );

【问题讨论】:

  • 您能否将带有异步调用和网格创建的代码添加到您的问题中?
  • 据我所知,更新DOM后触发DataBound事件;在 DOM 更改之前触发了一个 DataBinding 事件;你如何确定 DOM 在 dataBound 中没有准备好?
  • @LarsHöppner 你是对的——DOM 已经准备好了。我被没有可见的新 DOM 元素误导了。 我在代码中有一个错误,在调试器中它无法拾取项目。

标签: javascript kendo-ui kendo-grid


【解决方案1】:

根据剑道文档

http://docs.kendoui.com/api/framework/datasource#configuration-transport.read

数据源使用jQuery.ajax向远程发起HTTP请求 服务。通过 transport.read 配置的值被传递给 jQuery.ajax。这意味着您可以设置所有支持的选项 jQuery.ajax 通过 transport.read 除了成功和错误回调 运输使用的功能。

因此,您可以将complete 回调函数添加到数据源的transport.read 函数中,如下所示:

transport :
{
    read :
    {
        url : "http://url.com/...",
        dataType : "json",
        complete: function(data, status) {
            if (status === "success") {
                // your code that will be executed once the request is done
            }
        }
    }
},

【讨论】:

  • 谢谢,但这与使用网格的 dataBound 事件处理程序有何不同?挂钩 Ajax 调用仍然只会给我响应数据,而不是网格创建的 DOM 元素。另外,通过这种方式,我必须构建 OData URL,否则网格会执行此操作 - 如果网格具有排序/分页/过滤功能,那就有点复杂了。
  • complete 回调发生在 success 回调(Kendo 使用)完成之后。当success 回调完成时,构成网格的元素应该已经在 DOM 中了。
  • 我没有专门尝试过complete,但正如我所说,运行 Ajax 调用直接绕过网格的代码来生成正确的 OData URL。由于无法从网格中获取 URL,因此我不能这样做 - OData URL 是一个带有许多参数的复杂 URL(由来自基本 URL 的网格形成)。
  • 我不确定我明白你在说什么。 complete 函数不会绕过网格的原始代码,它只是 transport.read 对象的另一个属性(在内部转换为 jQuery.ajax 参数)。它所做的只是在 ajax 请求和内部成功回调(Kendo 在 DOM 中放置行)完成后执行代码。
  • 感谢您指出文档中的小花絮。事实证明,即使在dataBound 之后,DOM 仍然可用,但当时没有一个是可见的。我的代码也有一个错误——所有这些都误导了我。
猜你喜欢
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
相关资源
最近更新 更多