Kendo DataSource requestEnd事件被多次触发

时间:2017-09-19 21:12:33

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

我正在使用Telerik UI for ASP.NET MVC,我的网格定义如下

@(Html.Kendo().Grid<GridModel>()
        .Name("grid")
        .Columns(col =>
        {
            col.Bound(o => o.ID)
                .ClientTemplate("<input class = 't-checkbox-selectrow' type='checkbox' value='#=ID#'/><label></label>")
                .HeaderTemplate("<input class = 't-checkbox-selectallrows' type='checkbox' id='selectAll'/><label></label>")
                .Sortable(false)
                .Filterable(false)
                .HtmlAttributes(new { @class = "t-gridcol-selectrow" })
                .Width(40)
                .Locked(true).Lockable(false);            
            col.Bound(o => o.StatusName).Width(150);
            col.Bound(o => o.Deadline).Width(120);
            col.Bound(o => o.Cost).Width(150);                        
        })        
        .AutoBind(false)
        .Pageable(x => x.PageSizes(UIConstants.PageSizes))
        .Sortable(x => x.AllowUnsort(false))
        .Resizable(resizing => resizing.Columns(true))
        .Reorderable(reorder => reorder.Columns(true))
        .Scrollable(s => s.Height("Auto"))
        .DataSource(dataSource => dataSource
            .Ajax()
            .PageSize(UIConstants.DefaultPageSizeMax)
            .Read(read => read
            .Action("GetData", "DataProvider"))
            .ServerOperation(false))
    )

然后在JS文件中我将网格的页面重置为1 onRequestEnd,因此每当我从远程服务获取数据时,用户总是返回第一页

 $(function(){
     var ds = $("#grid").data("kendoGrid").dataSource;
     ds.bind("requestEnd", function (e){      
       e.sender.page(1);
     })
    })

根据kendo's documentation

  

requestEnd
  远程服务请求完成时触发。

然而,requestEnd事件也会在页面更改(和排序)时触发。因此,当我更改程序化页面时,它会再次触发requestEnd事件并进入循环。 (当我在UI上手动更改页面或排序时,注意requestEnd也会被触发)

这是设计还是错误的文档?

2 个答案:

答案 0 :(得分:0)

我做了类似下面的事情。 e.response仅在requestEnds作为服务器响应的一部分时填充。在所有其他情况下,它将为空。

dataSource.bind("requestEnd", function (e) {
        if (e.status != "error" && e.response != null) {                             
               // do soemething here                
        }

我真的希望剑道团队解决问题或创建新事件

答案 1 :(得分:0)

这个问题是 3 年前提出的,但我在查找其他信息时遇到了这个问题。我在这里的时候,我会替其他人回答,因为LP13可能不再关心这个了。

在 HTML Razer 代码中,将 RequestEnd 事件添加到数据源。下面是一个例子:

@(Html.Kendo().Grid<GridModel>()
    .Name("grid")
    // (snip)
    .DataSource(dataSource => dataSource
        .Ajax()
        .Events(o => o.DataBound("onDataBound"))
        .PageSize(UIConstants.DefaultPageSizeMax)
        .Read(read => read
        .Action("GetData", "DataProvider"))
        .ServerOperation(false))
)

现在在您的 jquery 中,您将编写您的事件处理程序:

function onRequestEnd(e) {
    console.log('onRequestEnd: e.response Object(The raw remote service response) = ', e.response);
    console.log('onRequestEnd: e.sender kendo.data.DataSource(The data source instance which fired the event) = ', e.sender);
    console.log('onRequestEnd: e.type String (The type of the request) = ', e.type);
}