You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编辑Kendo Scheduler弹窗模板并自定义结束时间下拉框

我来帮你搞定Kendo Scheduler遇到的这两个问题——自定义编辑器字段无法编辑,还有把结束时间转成下拉列表的需求,咱们一步步拆解解决:

问题1:自定义编辑器弹窗元素无法编辑

你说尝试了Telerik的脚本但只能创建新弹窗、没法编辑已有内容,核心原因大概率是自定义模板没和Scheduler的事件数据做好双向绑定,或者“Edit as New”按钮的逻辑有问题。

解决方案:

  1. 确保自定义模板用data-bind绑定字段
    你的代码里用了editable: { template: $("#editor").html() },但没给出#editor的内容。要让字段能编辑,模板里的元素必须通过data-bind属性关联到Scheduler事件的对应字段(比如title、start、end),示例模板如下:

    <script id="editor" type="text/x-kendo-template">
      <div class="k-edit-label">
        <label for="title">Title</label>
      </div>
      <div class="k-edit-field">
        <input type="text" class="k-input k-textbox" data-bind="value: title" name="title" required="required" />
      </div>
      <!-- 其他字段(比如start)同理,用对应的Kendo组件+data-bind -->
    </script>
    
  2. 修复“Edit as New”按钮的逻辑
    你之前的代码是创建空白新事件,而且可能因为弹窗动态生成导致事件绑定失效。修改成复制当前事件数据的方式,同时确保按钮只添加一次:

    edit: function(e) {
      if (!e.event.isNew()) {
        // 避免重复添加按钮
        if (!$("#editasnew").length) {
          $(".k-edit-buttons.k-state-default").prepend('<a class="k-button" id="editasnew">Edit as New</a>');
          // 绑定点击事件,复制当前事件创建新条目
          $("#editasnew").on("click", function(){
            var scheduler = $("#scheduler").data("kendoScheduler");
            scheduler.cancelEvent();
            // 复制原有事件数据,移除id让Scheduler识别为新事件
            var newEventData = $.extend({}, e.event.toJSON());
            delete newEventData.id;
            newEventData.title = "Copy of " + newEventData.title; // 可选:给新事件加标识
            setTimeout(function(){
              scheduler.addEvent(newEventData);
            }, 300);
          });
        }
      }
    }
    
问题2:将结束时间(end字段)转为下拉列表

要把end字段从默认的日期选择器改成下拉列表,需要在自定义模板里替换对应的组件,同时确保下拉选项的value能被Kendo解析为Date类型。

解决方案:

在#editor模板里添加下拉列表,用Kendo的DropDownList组件(更贴合UI风格),绑定到end字段:

<script id="editor" type="text/x-kendo-template">
  <!-- 其他字段(title、start)的模板代码... -->
  <div class="k-edit-label">
    <label for="end">End Time</label>
  </div>
  <div class="k-edit-field">
    <input id="endDropdown" data-bind="value: end" data-role="dropdownlist" 
           data-value-field="value" data-text-field="text" 
           data-source='[{"text":"09:00 AM", "value":"2013-06-06T09:00:00"}, {"text":"10:00 AM", "value":"2013-06-06T10:00:00"}, {"text":"11:00 AM", "value":"2013-06-06T11:00:00"}]' />
  </div>
</script>

这里的关键是:下拉选项的value要用ISO格式的日期字符串(比如2013-06-06T09:00:00),这样Kendo能自动把它解析为Date类型,正确回写到事件数据里。

完整整合代码

把上面的修改整合到你的代码里,最终版本如下:

<div id="scheduler"></div>

<script id="editor" type="text/x-kendo-template">
  <div class="k-edit-label">
    <label for="title">Title</label>
  </div>
  <div class="k-edit-field">
    <input type="text" class="k-input k-textbox" data-bind="value: title" name="title" required="required" />
  </div>

  <div class="k-edit-label">
    <label for="start">Start Time</label>
  </div>
  <div class="k-edit-field">
    <input type="text" data-role="datetimepicker" data-bind="value: start" name="start" required="required" />
  </div>

  <div class="k-edit-label">
    <label for="end">End Time</label>
  </div>
  <div class="k-edit-field">
    <input id="endDropdown" data-bind="value: end" data-role="dropdownlist" 
           data-value-field="value" data-text-field="text" 
           data-source='[{"text":"09:00 AM", "value":"2013-06-06T09:00:00"}, {"text":"10:00 AM", "value":"2013-06-06T10:00:00"}, {"text":"11:00 AM", "value":"2013-06-06T11:00:00"}]' />
  </div>
</script>

<script>
$("#scheduler").kendoScheduler({
  date: new Date("2013/6/6"),
  editable: {
    template: $("#editor").html()
  },
  edit: function(e) {
    if (!e.event.isNew()) {
      if (!$("#editasnew").length) {
        $(".k-edit-buttons.k-state-default").prepend('<a class="k-button" id="editasnew">Edit as New</a>');
        $("#editasnew").on("click", function(){
          var scheduler = $("#scheduler").data("kendoScheduler");
          scheduler.cancelEvent();
          var newEventData = $.extend({}, e.event.toJSON());
          delete newEventData.id;
          newEventData.title = "Copy of " + newEventData.title;
          setTimeout(function(){
            scheduler.addEvent(newEventData);
          }, 300);
        });
      }
    }
  },
  views: [
    { type: "day" }
  ],
  dataSource: [
    {
      id: 1,
      start: new Date("2013/6/6 08:00 AM"),
      end: new Date("2013/6/6 09:00 AM"),
      title: "Interview"
    }
  ]
});
</script>

内容的提问来源于stack exchange,提问作者Dichado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:19:06