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

使用Syncfusion Scheduler保存事件时遇组件重渲染值重置问题

Syncfusion Scheduler 保存时值被重置的解决方法

问题描述

使用Syncfusion Scheduler时,点击保存按钮后组件疑似重渲染并重置值。例如选择日期选择器的时间后,change事件能获取新值,但点击保存时,值又变回当前时间。训练师下拉框曾出现类似问题,目前通过读取previousItemData临时解决,希望彻底阻止该现象,让保存按钮直接读取组件当前值,避免触发重渲染。

用户提供的代码:

function onPopupOpen(args) {
    if (args.type === 'Editor') {
        var eventData = args.data;

        var startElement = args.element.querySelector('#StartTime');
        var startDrop = startElement.classList.item(3);

        var startPicker = startElement.ej2_instances[0];
        startPicker.change = function () {
            eventData.StartTime = startPicker.value;
        };

        var processElement = args.element.querySelector('#TrainerId');

        var dropdown = document.getElementById("TrainerId").ej2_instances[0];
        dropdown.previousItemData = null;
        var saveButton = args.element.querySelector('.e-event-save');

        saveButton.onclick = function () {
            console.log('save clicked');
            eventData.StartTime = startPicker.value;

            if (!dropdown.previousItemData) {
                console.log('Choose a trainer');
            } else {
                eventData.TrainerId = dropdown.previousItemData.Id;
            }
        };
    }
}

解决方案

1. 不要覆盖组件内置事件

你直接给startPicker.change赋值的方式会替换Scheduler编辑器的内置事件逻辑,导致组件无法正确同步值到eventData。改用事件监听的方式添加自定义逻辑:

// 替换原startPicker.change的赋值代码
startPicker.addEventListener('change', function () {
    eventData.StartTime = startPicker.value;
});

2. 利用Scheduler的actionBegin事件处理保存逻辑

不要直接绑定保存按钮的onclick事件,Scheduler提供的actionBegin事件会在保存动作触发时执行,此时能直接获取编辑器最新值,避免重渲染导致的重置:

function onActionBegin(args) {
    // 监听事件创建或修改的请求
    if (args.requestType === 'eventCreate' || args.requestType === 'eventChange') {
        // 获取日期选择器实例
        var startPicker = document.querySelector('#StartTime').ej2_instances[0];
        // 获取训练师下拉框实例
        var dropdown = document.getElementById("TrainerId").ej2_instances[0];
        
        // 更新事件的开始时间
        args.data.StartTime = startPicker.value;
        
        // 校验训练师选择
        if (!dropdown.value) {
            args.cancel = true; // 阻止保存操作
            console.log('Choose a trainer');
        } else {
            args.data.TrainerId = dropdown.value.Id;
        }
    }
}

在Scheduler初始化时注册该事件:

<ejs-scheduler id='Scheduler' actionBegin='onActionBegin' ...></ejs-scheduler>

3. 移除临时的previousItemData逻辑

使用actionBegin事件后,直接通过dropdown.value就能获取当前选中的训练师数据,无需依赖previousItemData临时属性,代码更稳定可靠。

4. 保证数据同步性

如果是框架环境(如React/Vue),需确保eventData的更新能被框架检测到;纯JS场景下,利用Scheduler内置事件即可保证数据与组件状态同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:19:55