添加自定义命令到 Kendo UI 动态数据源/网格

Add custom command to Kendo UI dynamic datasource / grid

我在 ASP.NET MVC 应用程序中使用 Kendo UI javascript 框架。

我必须在我的 Kendo UI 网格中加载由我的服务器提供的 动态 数据,所以我不想使用数据源模式和列定义,在任何情况下。

我的数据示例是:
PersonID、Data1、Data2、Date3 ...

要在 Kendo UI 网格中加载动态数据,我使用以下代码:(JsFidlle Example)

var grid = $("#grid").kendoGrid({ 
    scrollable: false,
    sortable: true
}).data("kendoGrid"); 

var ds = grid.dataSource;
grid.columns = [];    
ds.data([{one: 1, two: 1, three: 3, four: 4}]);

从这个例子开始,我很想知道,通过这种管理,我是否可以在每一行中放置一个命令/自定义命令,如“删除”。 (Example)

最后,我该如何处理命令的行为? (点击命令后看到确认 window 会很高兴)

感谢关注!

先获取数据,然后根据数据为网格列创建一个数组,并为按钮添加一列。

创建网格并将处理程序附加到每个按钮。

http://jsfiddle.net/cp67fpw1/2/

正在创建网格:

var columns = [],
    data = [{
        one: 1,
        two: 1,
        three: 3,
        four: 4,
        five: 5
    }],
    grid;

for (var cx in data[0]) {
    if (data[0].hasOwnProperty(cx)) {
        columns.push({
            field: cx
        })
    }
}

columns.push({
    field: '',
    template: '<a class="k-button" command="doit">do it</a><a class="k-button" command="doitagain">do it again</a>'
});

grid = $("#grid").kendoGrid({
    columns: columns,
    dataSource: new kendo.data.DataSource({
        data: data
    }),
    scrollable: false,
    sortable: true
}).data("kendoGrid");

添加按钮处理程序:

$('#grid').on('click', '[command="doit"]', doit);

function doit(e) {
    var dataItem = grid.dataSource.getByUid($(this).closest('tr').data('uid'));
}

我解决了这个问题:https://jsfiddle.net/Endrik/smLfh67e/1/

它与 Frederic 解决方案非常相似,但变化不大。

1) 我从数据源对象开始,因为我将从远程获取数据
如果更改 DataSource 对象中的数据加载类型,该示例应该同样有效。

var myDataSource = new kendo.data.DataSource({
    data: [{
            one: "1",
            two: "2",
            three: "3",
            four: "4"
        }, {
            one: "5",
            two: "6",
            three: "7",
            four: "8"
        }]
    });

    myDataSource.fetch();

2) 为了拥有动态列,我必须将数据源对象中存在的数据转换为值数组。 (比如 Frederic 的启动对象集合)

var myDataSourceRowsNumber = myDataSource.total();

var rows = [];
var columns = null;
var columnsCount = 0;

for (var i = 0; i < myDataSourceRowsNumber; i++) {
    var entryArray = [];
    var dataItem = myDataSource.at(i);

    columns = [];

    for (var field in dataItem) {
        if (dataItem.hasOwnProperty(field) && 
            field != 'parent' && 
            field != 'uid' && 
            field != '_events') {

            columns.push({
               field: field,
               value: dataItem[field.toString()]
            });
        }
    }

    columnsCount = columns.length;
    for (var j = 0; j < columnsCount; j++) {
        entryArray.push(dataItem[columns[j].field]);
    }

    rows.push(kendo.observable({
        entries: entryArray
    }));
}

var viewModel = kendo.observable({
    gridRows: rows
});

3) 最后,我用我定义的列创建了一个新的 Kendo UI 网格。

var finalColumns = [];
for (var k = 0; k <= columnsCount; k++) {
    var entryIndex = "entries[" + k + "]";
    if (k != columnsCount) {
        finalColumns.push({
            field: entryIndex,
            title: columns[k].field
        });
    } else {
        finalColumns.push({
            command: [{
                name: "CustomDelete",
                text: "Delete",
                className: "custom-delete-btn ",
                imageClass: "k-icon k-i-close",
                click: ManageDeleteButtonClick
            }],
            title: "Actions"
        });
    }
}

var configuration = {
    editable: true,
    sortable: true,
    scrollable: false,
    columns: finalColumns
};

function ManageDeleteButtonClick(e) {
    e.preventDefault();
    var dataItem = this.dataItem($(e.target).closest("tr"));
    if (confirm('Are you sure you want to delete this record ?')) {
        // AJAX CALL
        var dataSource = $("#grid").data("kendoGrid").dataSource;
        dataSource.remove(dataItem);
    }
}

var myGrid = $("#grid").kendoGrid(configuration).data("kendoGrid");
kendo.bind($('#example'), viewModel);