【问题标题】:Setting params in Kendo UI Grid when calling a rest service [Workaround]调用休息服务时在 Kendo UI Grid 中设置参数 [解决方法]
【发布时间】:2016-04-13 18:24:58
【问题描述】:

我有一个调用休息服务的 Kendo UI Grid。只要我不尝试使用任何参数,它就可以正常工作。

我知道其余服务是正确的,因为我可以从浏览器调用它,并获得正确的结果 [取决于我发送的参数]。另外,当我查看服务器日志时,我看到它正在调用没有参数的其余服务。

我的代码如下:

document).ready( function() {


         var crudServiceBaseUrl = "rsPC.xsp",
                    dataSource = new kendo.data.DataSource({
                        transport: {
                            read:  {
                                url: crudServiceBaseUrl + "/PCByStatus",
                                filter: {field: "status", value: "2" }                                  
                                dataType: "json",
                            update: {
                                url: crudServiceBaseUrl + "/PC/Update",
                                dataType: "json"
                            },
                            destroy: {
                                url: crudServiceBaseUrl + "/PC/Destroy",
                                dataType: "json"
                            },
                            create: {
                                url: crudServiceBaseUrl + "/PC/Create",
                                dataType: "json"
                            },
                            parameterMap: function(options, operation) {
                                if (operation !== "read" && options.models) {
                                    return {models: kendo.stringify(options.models)};
                                }
                            }
                        },
                        batch: true,
                        pageSize: 20,
                        scrollable: {
                        virtual: true
                          },
                        height: 543,
                        schema: {
                            model: {
                                id: "PCId",
                                fields: {
                                    PCId: {type:"string"},
                                    serialNumber: {type: "string"},
                                    officeLoc: {type: "string"},
                                    unid: {type:"string"},
                                    model: {type:"string"},
                                    checkInDate: {type: "string"}
                                                }
                            }
                        }
                    });


    // Grid
    grid = $("#grid").kendoGrid( {   
        dataSource: dataSource,
        columns : [ {
            field : "serialNumber",
            title : "Serial Number"
        }, {
            field : "model",
            title : "Model"
        }, {
            field : "officeLoc",
            title : "Office Location"
        }, {
            field : "checkInDate",
            title : "Check In Date",
            template: "#= kendo.toString(kendo.parseDate(checkInDate, 'yyyy-MM-dd'), 'MM/dd/yyyy') #"


        } ],

        pageable: {
             refresh: true,
             pageSizes: true,
             buttonCount: 5
         },
        dataBound : addExtraStylingToGrid,  
        reorderable : true,
        filterable : true,
        scrollable : true,
        selectable : true,
        sortable : true,            
    });

我仍然无法让它工作并且有点难过。

我有两个休息服务,一个返回所有数据,一个将“状态”作为一部分并返回一个等于参数的数据子集。

网址是:

http://localhost/scoApps/PC/PCApp.nsf/rsPC.xsp/PCByStatus?status=2

当输入浏览器时,我得到了正确的记录数。

所以我更改了代码(见下文)。我已经包含了 CSJS 的所有代码:

$(document).ready( function() {
    // Double Click On row
    $("#grid").on(
            "dblclick",
            " tbody > tr",
            function() {
                var grid = $("#grid").data("kendoGrid");
                var row = grid.dataItem($(this));
                window.location.replace("xpFormPC.xsp" + "?key=" + row.unid + "target=_self");                  
            });

    // Add hover effect
    addExtraStylingToGrid = function() {
        $("table.k-focusable tbody tr ").hover( function() {
            $(this).toggleClass("k-state-hover");
        });
    };

    // Search
    $("#search").keyup( function() {
        var val = $('#search').val();
        $("#grid").data("kendoGrid").dataSource.filter( {
            logic : "or",
            filters : [ {
                field : "serialNumber",
                operator : "contains",
                value : val
            }, {
                field : "officeLoc",
                operator : "contains",
                value : val
            }, {
                field : "model",
                operator : "contains",
                value : val
            } ]
        });
    });

    var crudServiceBaseUrl = "rsPC.xsp",
    dataSource = new kendo.data.DataSource({
        transport: {
        read:  {
        url: crudServiceBaseUrl + "/PCByStatus",
        dataType: "json"
    },
    update: {
        url: crudServiceBaseUrl + "/PC/Update",
        dataType: "json"
    },
    destroy: {
        url: crudServiceBaseUrl + "/PC/Destroy",
        dataType: "json"
    },
    create: {
        url: crudServiceBaseUrl + "/PC/Create",
        dataType: "json"
    },
    parameterMap: function(options, operation) {
        if (operation == "read"){
            options.field = "status"
                options.value = "2"
                    return options;
        }
        if (operation !== "read" && options.models) {
            return {models: kendo.stringify(options.models)};
        }
    }
    },
    batch: true,
    pageSize: 20,
    scrollable: {
        virtual: true
    },
    height: 543,
    schema: {
        model: {
        id: "PCId",
        fields: {
        PCId: {type:"string"},
        serialNumber: {type: "string"},
        officeLoc: {type: "string"},
        unid: {type:"string"},
        model: {type:"string"},
        checkInDate: {type: "string"}
    }
    }
    }
    });

    // Grid
    grid = $("#grid").kendoGrid( {   
        dataSource: dataSource,
        columns : [ {
            field : "serialNumber",
            title : "Serial Number"
        }, {
            field : "model",
            title : "Model"
        }, {
            field : "officeLoc",
            title : "Office Location"
        }, {
            field : "checkInDate",
            title : "Check In Date",
            template: "#= kendo.toString(kendo.parseDate(checkInDate, 'yyyy-MM-dd'), 'MM/dd/yyyy') #"


        } ],
        pageable: {
        refresh: true,
        pageSizes: true,
        buttonCount: 5
    },
    dataBound : addExtraStylingToGrid,  
    reorderable : true,
    filterable : true,
    scrollable : true,
    selectable : true,
    sortable : true     
    });

    // Edit
    function onEdit(e) {
    }

    // Change
    function onChange(args) {
        var model = this.dataItem(this.select());
        ID = model.ID;
    }
    ;

});

我做错了什么?

==========================================

我有一个解决方法。或者这可能是它应该做的方式。

var crudServiceBaseUrl = "rsPC.xsp", dataSource = new kendo.data.DataSource(
        {
            transport : {
            read : {
            url : crudServiceBaseUrl
            + "/PCByStatus?status=2",
            dataType : "json"
        },

现在我只是构建我想要的 URL。我想不是那么优雅,但它确实有效。

【问题讨论】:

  • 您应该发布最终代码作为您的答案,然后接受它。

标签: rest kendo-ui kendo-grid


【解决方案1】:

我有一个解决方法。或者这可能是它应该做的方式。

var crudServiceBaseUrl = "rsPC.xsp", dataSource = new kendo.data.DataSource(
        {
            transport : {
            read : {
            url : crudServiceBaseUrl
            + "/PCByStatus?status=2",
            dataType : "json"
        },

【讨论】:

    【解决方案2】:

    Filter 用于客户端数据,除非您将 serverFiltering 设置为 true。

    这里是filter kendo documentationserverFiltering documentation

    当我需要发送不是通过过滤我正在使用的控件创建的参数时,我使用parameterMapThe kendo documentation 提供了一个使用 parameterMap 的示例。

    这是我过去如何使用它的一个示例:

    var appsDataSource = new kendo.data.DataSource({
        transport: {
            read: {
                url: apiUrl + "App"
            },
            parameterMap: function (data, action) {
                if (action === "read") {
                    data.lobid = lobId;
                    data.parent = isParent;
                    return data;
                } else {
                    return data;
                }
            }
        }
    });
    

    尝试更改parameterMap

    parameterMap: function(options, operation) {
        if (operation == "read"){
            options.field = "status";
            options.value = "2";
            return options;
        }
        if (operation !== "read" && options.models) {
            return {models: kendo.stringify(options.models)};
        }
    }
    

    并更新read 定义以删除filter。要考虑的一件事是,如果 read 方法不符合不被读取的标准并且选项不为空,则您不会从该方法返回任何内容。这样就排除了现有代码中未明显处理的任何其他组合。

    【讨论】:

    • whipdancer,谢谢你的回复。我查看了文档并尝试了所有方法,但仍然无法使其正常工作。我在原始问题中添加了更多解释和代码。任何帮助将不胜感激。
    • 语法错误?您的代码是否包含参数映射下的分号,因为您发布的内容中缺少它们。刚刚意识到我发布的内容中缺少它们。
    • 仅供参考,here is a link to an answer I previously posted 带有完整的代码示例。如果我有时间,我会创建一个小提琴来演示。
    • 我非常感谢小提琴。我就是无法让它工作。
    • 有机会时请添加为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2012-02-29
    • 2015-08-07
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多