【问题标题】:Kendo grid batch editing - making a single call to save剑道网格批量编辑 - 一次调用保存
【发布时间】:2013-06-10 21:16:00
【问题描述】:

启用 Kendo 网格批量编辑后,我知道您可以挂接创建、更新和销毁命令,当您单击 Save Changes 时,Kendo 将向服务器发送 3 个单独的命令。

我想知道是否有任何方法可以将所有三组更新作为单个调用发送到服务器 - 就像事务一样。甚至可以按照指定的顺序发送每一个,在发送下一个之前检查是否成功。

我能想出的唯一方法是有一个自定义的保存更改实现,当调用它时,它将查找网格数据源以找出所有已添加的行(isNew() 用于添加的行),删除(_destroyed删除的行),更新(isDirty 更新的行),然后使用已识别的数据集使用 ajax 制作我自己对服务器端点的调用。

【问题讨论】:

    标签: kendo-ui kendo-grid


    【解决方案1】:

    Telerik 最近在他们的代码库中发布了一个解决方法:http://www.kendoui.com/code-library/mvc/grid/save-all-changes-with-one-request.aspx。不幸的是,解决方法相当简单。它提供了一个很好的示例,说明如何捕获已损坏、脏记录和新记录,但最后需要挥手处理响应中的任何错误,并在成功时同步数据源。另请注意,在发出 ajax 请求之前,没有检查以确保存在已销毁、脏记录或新记录。

    这里是相关代码。从上面的链接下载完整示例,查看网格是如何设置的,并确保您拥有最新版本。

    function sendData() {
        var grid = $("#Grid").data("kendoGrid"),
            parameterMap = grid.dataSource.transport.parameterMap;
    
        //get the new and the updated records
        var currentData = grid.dataSource.data();
        var updatedRecords = [];
        var newRecords = [];
    
        for (var i = 0; i < currentData.length; i++) {
            if (currentData[i].isNew()) {
                //this record is new
                newRecords.push(currentData[i].toJSON());
            } else if(currentData[i].dirty) {         
                updatedRecords.push(currentData[i].toJSON());
            }
        }
    
        //this records are deleted
        var deletedRecords = [];
        for (var i = 0; i < grid.dataSource._destroyed.length; i++) {
            deletedRecords.push(grid.dataSource._destroyed[i].toJSON());
        }
    
        var data = {};
        $.extend(data, parameterMap({ updated: updatedRecords }), parameterMap({ deleted: deletedRecords }), parameterMap({ new: newRecords }));
    
        $.ajax({
            url: "/Home/UpdateCreateDelete",
            data: data,
            type: "POST",
            error: function () {
                //Handle the server errors using the approach from the previous example
            },
            success: function () {
                alert("update on server is completed");
    
                grid.dataSource._destroyed = [];
                //refresh the grid - optional
                grid.dataSource.read();
            }
        })
    }
    

    【讨论】:

      【解决方案2】:

      也许你可以启用Datasourcebatch属性

      批量布尔值(默认:false)

      如果设置为 true,数据源将批量处理 CRUD 操作请求。例如,更新两个数据项将导致一个 HTTP 请求而不是两个。默认情况下,数据源会为每个 CRUD 操作发出 HTTP 请求。

      来源:Datasource API

      【讨论】:

      • 谢谢@Romain。这就是我打开批量编辑的意思。我确实在我的数据源上设置了 batch:true 。 Kendo 将为一组更新的行发送一个 HTTP 请求,一个单独的 HTTP 请求用于销毁所有已删除的行。但我想要一个 HTTP 请求来完成所有更新、创建和删除操作。
      【解决方案3】:

      六年后我们有了答案,检查提交功能以执行单个请求以保存所有更改:https://docs.telerik.com/kendo-ui/api/javascript/data/datasource/configuration/transport.submit

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-22
        • 1970-01-01
        • 2018-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多