4

我正在尝试在我的网格中使用下拉列表。这是我的网格定义:

$("#grid").kendoGrid({
    editable: true,
    dataSource: {
        data: data,
        schema: {
            model: {
                fields: {
                    Name: {
                        type: "string",
                        editable: false
                    },
                    FruitName: {
                        type: "string"
                    },
                    FruitID: {
                        type: "number"
                    }
                }
            }
        }
    },
    columns: [{
        field: "Name",
        title: "Name",
        width: 150
    }, {
        field: "Fruit",
        title: "Fruit",
        width: 115,
        editor: renderDropDown,
        template: "#=FruitName#"
    }]
});

这是我的编辑器功能:

function renderDropDown(container, options) {
    var dataSource = [
    //{ name: "", id: null },
    {
        FruitName: "Apple",
        FruitID: 1
    }, {
        FruitName: "Orange",
        FruitID: 2
    }, {
        FruitName: "Peaches",
        FruitID: 3
    }, {
        FruitName: "Pears",
        FruitID: 4
    }];

    $('<input required  name="' + options.field + '"/>')
        .appendTo(container)
        .kendoDropDownList({
        dataTextField: "FruitName",
        dataValueField: "FruitID",
        dataSource: dataSource
    });
}

这是一个关于 JSBin 的演示用于说明:http: //jsbin.com/malev/3/edit

我的是一个两部分的问题。

  1. 为什么此示例中的下拉菜单在编辑之前没有默认为列中的值?

  2. 为什么选择后文本会切换到值?

4

1 回答 1

7

看看你的列定义:

{
    field: "Fruit",
    title: "Fruit",
    width: 115,
    editor: renderDropDown,
    template: "#=FruitName#"
}

您的字段名称是Fruit。在编辑器中,您绑定到此字段名称,但您的模式模型和您的数据只有一个FruitID属性。这解释了为什么下拉菜单没有正确显示初始值。

另一个问题是,如果您需要从编辑器更新模型的两个属性,您需要手动执行此操作,例如通过这样设置您的编辑器:

$('<input required  name="' + options.field + '"/>')
    .appendTo(container)
    .kendoDropDownList({
    dataTextField: "FruitName",
    dataValueField: "FruitID",
    dataSource: dataSource,
    change: function (e) {
        var dataItem = e.sender.dataItem();
        options.model.set("FruitName", dataItem.FruitName);
    }
});

另一种方法是使用查找功能,为您提供给定值的显示文本,例如:

var fruitNames = ["", "Apple", "Orange", "Peaches", "Pears"];
function getFruitName(value) {
    return fruitNames[value];
}

然后你可以在你的模板中使用它:

template: "#= getFruitName(FruitID) #"

并且您不需要在编辑器中为名称和更改处理程序提供单独的列。

更新的演示

于 2014-02-15T03:59:20.053 回答