1

グリッドを作成するコード:

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/でバグのデモを参照してください。

4

1 に答える 1

2

これは kendoColumnMenu (2013.2.1002 までのバージョンに影響) の欠陥であり、次の条件下でバグが発生します。

  1. Array.prototype が変更され、「contains」などのメソッドが追加されました。
  2. グリッド オプションには columnMenu: true が含まれます

kendoColumnMenu のプライベート var "template" を変更する必要があります: 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>'; 

現時点でこれを修正する唯一の方法は、kendoColumnMenu の kendo UI のソース コードを編集することです。

于 2013-10-17T12:19:31.127 に答える