4

我在 Kendo UI 中有一个奇怪的问题 - 我不明白。

这是我的代码。

$(document).ready(function() {
    var kendo_dataSource = new kendo.data.DataSource({
        autoSync: true,
        batch: true,
        transport: {
            read: {
                url: "<?php echo BASE_URL . 'kendo/kendo_grid_read' ?>",
                dataType: "json"
            },
            destroy: {
                url: "<?php echo BASE_URL . 'kendo/kendo_grid_destroy' ?>",
                dataType: "json",
                type: "POST"
            },
            parameterMap: function(data, type) {
                if (type == "destroy") {
                    return {models: data.models}
                }
            }
        },
        serverFiltering: true,
        serverGrouping: true,
        serverPaging: true,
        page: 1,
        pageSize: 5,
        schema: {
            data: "results",
            total: "total",
            model: {
                id: "field1"
            }
        }
    });

    $("#kendo_grid2").kendoGrid({
        dataSource: kendo_dataSource,
        height: 300,
        filterable: true,
        sortable: true,
        pageable: true,
        selectable: "multiple row",
        columns: [
            {
                field: "field1"
            },
            {
                field: "field2"
            },
            {
                field: "field3"
            }
        ]
    });

    $("#test_button").on("click", function() {
        var selectedRows = $("#kendo_grid2").data("kendoGrid").select();
        if (selectedRows.length > 0) {
            for (var i = 0; i < selectedRows.length; i++) {
                var dataItem = $("#kendo_grid2").data("kendoGrid").dataItem(selectedRows[i]);
                console.log(dataItem);
                kendo_dataSource.remove(dataItem);
            }
        }
    });

});

情况就是这样。

$("#test_button").on("click", function()被触发时,它会检查网格中的选定行 - 并删除这些行。

如果我选择 2 行,它会删除 2 行。并且 2 行从网格中消失了。

但是,我看到了一些奇怪的东西——

删除 2 行时,有 2 个 POST 请求 - 这很好。

但是第一个 POST 请求的参数是

models[0][field1]   3
models[0][field2]   poioioi
models[0][field3]   oiuoiuuigbhkjh
models[0][field4]   kjh kjhkjhyt

第二个 POST 请求的参数是

models[0][field1]   3
models[0][field2]   poioioi
models[0][field3]   oiuoiuuigbhkjh
models[0][field4]   kjh kjhkjhyt
models[1][field1]   4
models[1][field2]   kjhk hkiui
models[1][field3]   khkj
models[1][field4]   mkhkhkhkjhghgfgdf

我明白,我可以像这样访问服务器中的数据

foreach ($_POST['models'] as $model) {
            echo $model['field1'];           
}

我想知道是否可以只发送一个请求 - 可能只发送第二个 POST 请求,因为我可以在一个请求中删除 2 行。

或者发送 2 个单独的请求,但一次只有一个模型?

是否可以?

任何帮助将不胜感激。

4

5 回答 5

3

这是设置造成的autoSync。当您将其设置为 true 时,数据源会sync在每次更改后调用该方法。设置autoSyncfalse手动调用该sync()方法将导致数据源仅对所有已删除的数据项发出一个请求。

于 2013-04-11T11:18:11.437 回答
3

就我而言,我手动删除 _destroyed 数据:

event.sender._destroyed = [];

 var gridOptions = {
    dataSource: {
        transport: {
            read: {
                url: crudServiceBaseUrl + "gettransactions",
                type: "GET"
            },
            destroy: {
                url: crudServiceBaseUrl + "delete",
                dataType: "jsonp",
                type: "POST"
            },
            parameterMap: function (models, operation) {
                if (operation == "destroy" && models)
                    return { models: kendo.stringify(models) };
            }
        },
        requestEnd: function (event) {
            event.sender._destroyed = [];
            grid.data('kendoGrid').refresh();
        },
        schema: {
            data: "listTransaction",
            total: "total",
            model: {
                id: "TransactionCustomerID",
                fields: {
                    TransactionCustomerID: { editable: false, nullable: true },
                    TransactionTime: { type: "date", editable: false }
                }
            },
            errors: "Errors"
        },
        change: function (event, abc) {
            //todo change fucntion              
        },
        serverPaging: false,
        serverFiltering: false,
        error: function (e) {
            console.log("Status: " + e.status + "; Error message: " + e.errorThrown);
        }
    },
    batch: true,
    editable: "popup",
    autoSync: true,
    resizable: true,
    columns: columnOptions,
    sortable: { mode: "single", allowUnsort: true },
    filterable: false,
    pageable: {
        pageSize: 20,
        pageSizes: [20, 50, 100],
        refresh: true
    },
    cancel: function () {
        grid.data('kendoGrid').dataSource.read();
        grid.data('kendoGrid').refresh();
    },
    dataBound: function (e) {
        hideGridButtonText(".k-delete");
        handleEmptyData(e);
    },
    excel: {
        fileName: "Transaction List.xlsx",
        filterable: true,
        allPages: false,
        downloadElement: "#exportexcel"
    }
};

这是工作!

于 2015-10-27T07:36:27.333 回答
1

我遇到了类似的问题。

我正在为数据源的破坏属性使用一个函数。我的问题是,每次连续删除一行时,销毁函数都会以累积的方式被调用一次。这意味着对于第一次删除,该函数被调用一次,对于第二次删除,它被调用两次,依此类推。

就我而言,问题是因为我没有通知数据源成功删除。下面是来自 Kendo UI文档的相关代码部分。我错过了成功的部分。

    destroy: function (options) {
      $.ajax({
        url: "http://demos.kendoui.com/service/products/destroy",
        dataType: "jsonp",
        data: {
          models: kendo.stringify(options.data.models)
        },
        success: function(result) {
          // notify the data source that the request succeeded
          options.success(result);
        },
        error: function(result) {
          // notify the data source that the request failed
          options.error(result);
        }
      });
于 2013-11-06T20:41:19.813 回答
0

好的,所以我想我已经找到了问题的根源。

我订阅了数据源错误事件,我看到在 JSon 解析期间发生错误(parseerror)。因此 dataItem 不会从数据源中删除。(这就是为什么数据源没有很好地同步,我在这一点上是对的)。

发生 parseerror 是因为我的删除 web 服务返回一个空字符串。

现在我需要找到解决它的方法......

于 2013-08-14T15:44:26.933 回答
0

对我来说,它只是将 autoSync 设置为 false!尝试一下。

于 2018-11-21T16:04:50.240 回答