这是场景:我想使用 Kendo UI 为外键列网格实现自定义自动完成编辑器。
这是解决方案:对于外键网格列,我使用默认的 kendo 机制,因此该列显示值而不是 id。
这就是问题所在:对于该列,我使用自定义自动完成编辑器,但是:
- 当我单击自动完成小部件时,它显示的是 id 而不是值
- 当我保存新值时,自动完成小部件不显示该值
下面的代码显示了详细的网格初始化(未显示主网格)。柱子
group_id
是外键。多变的
团体
包含用于显示组名而不是 id 的键值列表。
getGroupsAsync(e)
是从指定数据源读取所有可用组列表的函数。
//function used to async load groups
var getGruppiAsync = function (e) {
var deferred = $.Deferred(),
loadGruppi = function () {
new kendo.data.DataSource({
type: "odata",
serverPaging: false,
transport: {
read: "/Services/MusicStore.svc/GetGroupsByUser?id_utente=guid'" + e.data.id_utente + "'"
},
schema: {
data: function (data) {
return data.d.results;
},
total: function (data) {
return data.d.results.length;
}
}
}).fetch(function (data) {
deferred.resolve($.map(data.items, function (item) {
return {
value: item.id_gruppo,
text: item.nome
};
}));
});
};
window.setTimeout(loadGruppi, 1);
return deferred.promise();
};
$.when(getGroupsAsync(e)).done(function (groups) {
$("<div id='group-grid'/>").appendTo(e.detailCell).kendoGrid({
toolbar: ["create", "save", "cancel"],
editable: "incell",
autoBind: true,
dataSource: {
type: "odata",
serverFiltering: true,
transport: {
read: {
url: "/Services/MusicStore.svc/Gruppi_Utenti"
},
create: {
url: function () {
return "/Services/MusicStore.svc/Gruppi_Utenti"
},
type: "POST",
data: function (data) {
data.utente_id = e.data.id_utente;
data.id_gruppi_utente = Math.uuid();
data.gruppo_id = selectedGruppo;
if (data.id_gruppo)
delete data["id_gruppo"];
},
},
update: {
url: function (data) {
return "/Services/MusicStore.svc/Gruppi_Utenti(guid'" + data.id_gruppi_utente + "')";
},
type: "PUT",
data: function (data) {
data.gruppo_id = selectedGruppo;
if (data.id_gruppo)
delete data["id_gruppo"];
}
},
destroy: {
url: function (data) {
return "/Services/MusicStore.svc/Gruppi_Utenti(guid'" + data.id_gruppi_utente + "')";
},
type: "DELETE"
},
parameterMap: function (data, type) {
if (type == "read") {
// call the default OData parameterMap
var result = kendo.data.transports.odata.parameterMap(data);
if (result.$filter) {
// encode everything which looks like a GUID
var guid = /('[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')/ig;
result.$filter = result.$filter.replace(guid, "guid$1");
}
return result;
} else return JSON.stringify(data);
}
},
filter: { field: "utente_id", operator: "eq", value: e.data.id_utente },
schema: {
model: detailModel,
total: function (response) {
if (response.length == 0) return 0;
return response.d.__count;
}
},
error: showError
},
columns: [
{
field: "group:id",
title: "Gruppi",
editor: detailEditor,
values: groups,
},
{
command: ["destroy"], title: " "
}
]
});
});
此功能为列 group_id 提供自动完成编辑器
var gruppiDataSource = new kendo.data.DataSource({
type: "odata",
serverPaging: false,
serverFiltering: false,
transport: {
read: "/Services/MusicStore.svc/Gruppi",
},
schema: {
data: function (data) {
return data.d.results;
},
total: function (data) {
return data.d.results.length;
}
}
});
gruppiDataSource.read();
function detailEditor(container, options) {
//$('<input data-text-field="nome" data-text-value="nome" data-bind="value:' + options.field + '"/>')
$('<input data-text-field="nome" data-bind="value:' + options.field + '"/>')
.appendTo(container)
.kendoAutoComplete({
//index: 0,
highlightFirst: true,
autoBind: false,
placeholder: "Select group",
dataTextField: "nome",
//dataValueField: "id_gruppo",
filter: "contains",
minLength: 3,
select: onGroupSelect,
change: function(e){
},
dataSource: gruppiDataSource
});
}
这段代码的问题是,当我进入编辑模式时,自动完成小部件显示组的 id 而不是名称,当我保存数据时,小部件保持空白。
数据被发送到服务器,但我无法获得具有正确值的 gui 元素。
一些建议?