试图在kendo schedular的自定义视图中连接多选,但它不显示数据源数据。来自服务器的数据&存储在资源内部。其他字段显示正常。有人能帮我解决这个问题吗?
数据源
$scope.attendeesDS = new kendo.data.DataSource({
type: "odata",
transport: {
read:
{
url: "odata/AttendeesOData",
dataType: "json"
}
},
schema: {
data: function(data) {
return data["value"];
},
total: function(data) {
return data["odata.count"];
},
model: {
fields: {
value: { from: "Id", type: "number" },
text: { from: "text", type: "string" },
color: { from: "color", type: "string" }
}
}
},
serverPaging: true,
serverSorting: true,
serverFiltering: true,
pageSize: 15
});调度程序初始化
$("#ksheduler").kendoScheduler({
date: new Date(),
startTime: new Date("2015/1/1 07:00 AM"),
dateHeaderTemplate: kendo.template("<strong>#=kendo.toString(date, 'd/M')#</strong>"),
height: 600,
views: [
"day",
{ type: "workWeek", selected: true },
"week",
"month",
"agenda",
{ type: "timeline", eventHeight: 50 }
],
timezone: "Etc/UTC",
editable: {
template: kendo.template($("#schedulerTemplate").html())
},
dataSource: {
type: "odata-v4",
batch: false,
sync: function (e) {
var scheduler = $("#ksheduler").data("kendoScheduler");
if (scheduler) {
scheduler.refresh();
scheduler.dataSource.read();
}
},
transport: {
//cache: false,
read: {
url: "odata/ScheduleOData",
dataType: "json",
contentType: "application/json; charset=utf-8",
},
update: {
url: "odata/ScheduleOData",
type: "Post",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: function (response) {
if (response.Attendees == null) {
response.Attendees = [];
}
if (response.Clients == null) {
response.Clients = [];
}
if (response.Tutees == null) {
response.Tutees = [];
}
if (response.Placements == null) {
response.Placements = [];
}
return response;
},
},
create: {
url: "odata/ScheduleOData",
type: "Post",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: function (response) {
if (response.Attendees == null) {
response.Attendees = [];
}
if (response.Clients == null) {
response.Clients = [];
}
if (response.Tutees == null) {
response.Tutees = [];
}
if (response.Placements == null) {
response.Placements = [];
}
return response;
},
},
destroy: {
url: function (data) {
return "odata/ScheduleOData(" + data.Id + ")";
},
type: "Delete",
dataType: "json",
contentType: "application/json; charset=utf-8",
},
parameterMap: function (data, operation) {
if (operation == "destroy") {
return;// kendo.stringify(data);
}
var d = kendo.data.transports.odata.parameterMap(data, operation);
delete d.$inlinecount; // <-- remove inlinecount parameter
delete d.$callback;
return d;
}
},
schema: {
data: function (data) {
return data["value"];
},
total: function (data) {
return data['@odata.count'];
},
model: {
id: "taskId",
fields: {
taskId: { from: "Id", type: "number" },
title: { from: "Title", defaultValue: "Interview", validation: { required: true } },
start: { type: "date", from: "StartDate" },
end: { type: "date", from: "EndDate" },
startTimezone: { from: "StartTimezone" },
endTimezone: { from: "EndTimezone" },
description: { from: "Description" },
recurrenceId: { from: "RecurrenceID", defaultValue: 0 },
recurrenceRule: { from: "RecurrenceRule" },
recurrenceException: { from: "RecurrenceException" },
isAllDay: { type: "boolean", from: "IsAllDay" },
isInterview: { type: "boolean", from: "IsInterview", title: "Interview", defaultValue: true },
isSession: { type: "boolean", from: "IsSession", title: "Session" },
attendees: { from: "Attendees", nullable: true },
clients: { from: "Clients", nullable: true },
tutees: { from: "Tutees", nullable: true },
placements: { from: "Placements", nullable: true },
ownerId: { from: "OwnerID", defaultValue: 0 },
location: { from: "Location" },
notes: { from: "Notes" },
}
}
},
},
resources: [
{
field: "attendees",
dataSource: $scope.attendeesDS,
multiple: true,
dataTextField: "text",
dataValueField: "id",
title: "Tutors",
nullable: true
}
]
});自定义模板中的多选
<div class="k-edit-label">
<label for="Attendees">Tutors</label>
</div>
<div data-container-for="Attendees" class="k-edit-field">
<select id="Attendees" multiple="multiple" name="Attendees"
data-role="multiselect"
data-bind="value: attendees"
data-source="attendees"
data-text-field="text"
data-value-field="id"
data-value-primitive="true"></select>
</div>发布于 2015-05-28 20:35:42
首先,你选择数据源的方式,嗯,我不认为它是正确的,改用这种方式:
您需要添加编辑事件,以便可以将数据源添加到计划程序上的可编辑模板。
edit: function(e) {
debugger;
var ownerId = e.container.find("#ownerId").data("kendoDropDownList");
var attendeesId = e.container.find("#attendeesId").data("kendoMultiSelect");
//bind the widget to the resouces
ownerId.dataSource.data(e.sender.resources[0].dataSource.data());
attendeesId.dataSource.data(e.sender.resources[1].dataSource.data());
}我已经修改了调度器的kendo dojo示例,当您编辑调度器的事件时,它将使用自定义的可编辑模板并添加多选
我还修改了kendo示例,并在其自定义模板中添加了multiselect,
<div data-container-for="attendeesId" class="k-edit-field">
<select id="attendeesId" data-bind="value:attendeesId" data-role="multiselect" data-value-field="id" data-text-field="name"/>
</div>并修改资源数据
resources: [
{
field: "ownerId",
title: "Owner",
dataSource: [
{ text: "Alex", value: 1, color: "#f8a398" },
{ text: "Bob", value: 2, color: "#51a0ed" },
{ text: "Charlie", value: 3, color: "#56ca85" }
]
},{
field: "attendeesId",
title: "Attendees",
dataSource:[
{name:"Brown",id:"1"},
{name:"Daniel",id:"2"},
{name:"John",id:"3"},
{name:"Hawk",id:"4"},
{name:"Borne",id:"6"},
{name:"Deryl",id:"7"},
{name:"Jack",id:"8"}
]
}
],编辑:关于你的评论:“我在你的例子中看不到在模型中定义了attendeesId &我如何获得已经选择的与会者。”
假设您想要存储数据类型为对象数组的多选,我已经了解到目前kendo模型不能根据kendo forum处理复杂的数据类型,如对象或数组,因此解决此问题的方法参考此link。您可以将其存储在单独的kendo observable上,并将可观察对象绑定到添加了此kendo.bind(e.container.find("#attendeesId"), viewModel);的multiselect on edit函数。还要看一下参数映射,我在其中检索selectedAttendees,然后将其添加到option.model中,然后继续保存/更新到服务器的过程
if (operation !== "read" && options.models) {
if(typeof options.models !== "undefined"){
options.models[0].selectedAttendees = viewModel.selectedAttendees;
console.log("the models here :",options.models);
}
return {models: kendo.stringify(options.models)};
}我还修改了这个新kendo dojo上的示例,您可以看到options.models的控制台日志现在具有selectedAttendees属性。
https://stackoverflow.com/questions/30505111
复制相似问题