为什么Kendo UI网格中的列菜单会导致错误?

时间:2013-10-17 12:19:31

标签: javascript jquery kendo-ui kendo-grid

创建网格的代码:

var grid = $("#grid").kendoGrid({
    dataSource: [],
    columnMenu: true,
    scrollable: true,
    sortable: false,
    filterable: true,
    groupable: true,
    columns: [{
        field: "Id",
        title: "Id",
        filterable: false
    }, {
        field: "title",
        title: "Title"
    }]
}).data("kendoGrid");

我也以这种方式定制了Array的原型:

Function.prototype.method = function (name, func) {
    "use strict";

    if (!this.prototype[name]) {
        this.prototype[name] = func;
        return this;
    }
};

Array.method('contains', function (object) {
    return $.inArray(object, this) !== -1;
});

结果:每当我尝试打开任何列的列菜单时,我都会得到:

Uncaught TypeError: Cannot call method 'replace' of undefined

http://jsfiddle.net/lhoeppner/sNdVR/

上查看错误演示

1 个答案:

答案 0 :(得分:2)

这是kendoColumnMenu中的一个缺陷(影响版本高达2013.2.1002),导致在以下情况下出现错误:

  1. 将Array.prototype更改为具有其他方法,例如“含”
  2. 网格选项包含columnMenu:true
  3. 需要更改kendoColumnMenu中的私有var“模板”:在for循环中,以下列形式添加对hasOwnProperty的检查:

    '#if (columns.hasOwnProperty(col)) {#' +
    

    完整的模板将是:

    var template = '<ul>' +
    '#if(sortable){#' +
    '<li class="k-item k-sort-asc"><span class="k-link"><span class="k-sprite k-i-sort-asc"></span>${messages.sortAscending}</span></li>' +
    '<li class="k-item k-sort-desc"><span class="k-link"><span class="k-sprite k-i-sort-desc"></span>${messages.sortDescending}</span></li>' +
    '#if(showColumns || filterable){#' +
    '<li class="k-separator"></li>' +
    '#}#' +
    '#}#' +
    '#if(showColumns){#' +
    '<li class="k-item k-columns-item"><span class="k-link"><span class="k-sprite k-i-columns"></span>${messages.columns}</span><ul>' +
    '#for (var col in columns) {#' +
    '#if (columns.hasOwnProperty(col)) {#' +
    '<li><input type="checkbox" data-#=ns#field="#=columns[col].field.replace(/\"/g,"&\\#34;")#" data-#=ns#index="#=columns[col].index#"/>#=columns[col].title#</li>' +
    '#}#' +
    '#}#' +
    '</ul></li>' +
    '#if(filterable){#' +
    '<li class="k-separator"></li>' +
    '#}#' +
    '#}#' +
    '#if(filterable){#' +
    '<li class="k-item k-filter-item"><span class="k-link"><span class="k-sprite k-filter"></span>${messages.filter}</span><ul>' +
    '<li><div class="k-filterable"></div></li>' +
    '</ul></li>' +
    '#}#' +
    '</ul>'; 
    

    此刻解决此问题的唯一方法是编辑kendo UI的kendoColumnMenu源代码。