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

如何让Kendo Scheduler聚焦刚添加/编辑的事件?

解决Kendo UI Scheduler添加/编辑事件后精准聚焦问题

核心思路

绕过Kendo默认FocusService的自动聚焦逻辑,直接定位到刚操作的事件DOM元素手动聚焦,同时更新Scheduler的activeEvent状态避免后续干扰。

方法一:事件回调中手动定位聚焦

在Scheduler的add、edit完成回调中,获取目标事件的数据项,等待DOM渲染完成后找到对应元素并聚焦:

// 以Angular环境为例,其他框架逻辑通用
onEventSave(e: any) {
  // 获取刚添加/编辑后的事件数据项
  const targetEvent = e.dataItem;
  
  // 延迟执行确保DOM已更新
  setTimeout(() => {
    // 通过事件ID定位DOM元素(Kendo会给事件节点自动添加data-event-id属性)
    const eventElement = this.schedulerInstance.element.find(`[data-event-id="${targetEvent.id}"]`)[0];
    
    if (eventElement) {
      // 手动触发聚焦
      eventElement.focus();
      // 更新Scheduler的活跃事件状态,覆盖默认的第一个事件
      this.schedulerInstance.activeEvent = targetEvent;
    }
  }, 100);
}

方法二:自定义FocusService覆盖默认行为

如果需要全局修改聚焦逻辑,可以重写Kendo的FocusService(适用于Angular环境):

  1. 创建自定义服务类:
import { FocusService } from '@progress/kendo-angular-scheduler';
import { Injectable } from '@angular/core';

@Injectable()
export class CustomSchedulerFocusService extends FocusService {
  focusEvent(event: any): void {
    if (event?.id) {
      // 精准定位目标事件DOM
      const eventElement = this.scheduler.element.find(`[data-event-id="${event.id}"]`)[0];
      if (eventElement) {
        eventElement.focus();
        this.scheduler.activeEvent = event;
        return;
      }
    }
    // 无匹配时回退到默认逻辑
    super.focusEvent(event);
  }
}
  1. 在组件/模块中替换默认服务:
@NgModule({
  providers: [
    { provide: FocusService, useClass: CustomSchedulerFocusService }
  ]
})
export class YourSchedulerModule { }

方法三:删除事件后的聚焦处理

如果删除的是当前活跃事件,可手动指定新的聚焦目标(比如删除事件的前一个/后一个事件):

onEventRemove(e: any) {
  const removedEventId = e.dataItem.id;
  // 获取剩余事件列表,筛选出需要聚焦的事件
  const remainingEvents = this.schedulerInstance.data.filter(item => item.id !== removedEventId);
  if (remainingEvents.length > 0) {
    // 自定义逻辑:这里聚焦最后一个剩余事件,可根据需求调整
    const targetEvent = remainingEvents[remainingEvents.length - 1];
    setTimeout(() => {
      const eventElement = this.schedulerInstance.element.find(`[data-event-id="${targetEvent.id}"]`)[0];
      eventElement?.focus();
      this.schedulerInstance.activeEvent = targetEvent;
    }, 100);
  }
}

关键注意事项

  • 必须等待DOM更新完成后再操作,所以用setTimeout做延迟(时间可根据实际渲染速度调整)
  • 确保事件数据项有唯一id字段,Kendo会自动将其绑定到DOM的data-event-id属性
  • 更新activeEvent状态是为了让后续的Scheduler操作(比如键盘导航)基于正确的事件上下文

内容的提问来源于stack exchange,提问作者Govert Jaap den Boef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:27:14