在许多场景中,限制在同一时间段内可安排的事件数量非常重要。例如,如果某个时间段已经安排了一个事件,您可能希望阻止添加第二个事件。
要管理单个时间段内允许的事件数量,可以使用 collision 扩展。
激活 'collision' 扩展
scheduler.plugins({
collision: true
});
一旦在页面上启用该扩展,无论是创建新事件还是移动已有事件,系统都会阻止用户在同一时间段内安排两个事件。
默认情况下,每个时间段只允许一个事件。要调整此限制,请使用 collision_limit 属性:
限制每个时间段最多只能创建2个事件
scheduler.config.collision_limit = 2; //允许每个时间段创建2个事件
Related sample: Controlling the number of events in a time slot
当 'collision' 扩展 启用时,每当用户尝试在已有事件的时间段内添加或移动事件时,调度器会触发 onEventCollision 事件。此事件会根据 collision_limit 属性设置的限制进行检查。
请注意,onEventCollision 事件在数据加载期间不会触发。若要在加载数据时也强制执行事件数量限制,需要稍作代码补充:
限制每个时间段最多只能创建/加载2个事件
scheduler.config.collision_limit = 2; //允许每个时间段创建2个事件
scheduler.attachEvent("onEventLoading", function(ev){ return scheduler.checkCollision(ev); });
checkCollision 方法会检查某个事件是否与现有事件重叠,并相应触发 onEventCollision 事件。
要查询某个特定时间段内已安排了多少事件,可以使用 getEvents 方法:
获取某个时间段内的事件数量
var count = scheduler.getEvents(ev.start_date, ev.end_date).length;
请注意,getEvents 方法会遍历所有事件并比较它们的日期,因此当事件数量非常多时,该操作可能需要一些时间。
以下是防止同一时间段内事件冲突的步骤汇总:
1) 在页面中引入 collision 扩展:
scheduler.plugins({
collision: true
});
2) 在从服务器加载数据期间,阻止用户创建新事件。
这可以确保在日历完全加载之前无法添加事件。请结合 onLoadEnd 和 onLoadStart 事件处理器,以及 readonly 属性,如下所示:
// 在开始从数据源加载数据前,使调度器只读
scheduler.attachEvent("onLoadStart", function(){
scheduler.config.readonly = true;
});
// 在数据源加载完成后,使调度器可编辑
scheduler.attachEvent("onLoadEnd", function(){
scheduler.config.readonly = false;
});
3) 启用动态加载,以提升在处理大量记录时的性能,避免一次性加载所有数据。
要启用动态加载,请在加载数据前调用 setLoadMode 方法:
启用动态加载
scheduler.setLoadMode("month");
scheduler.load("/some");
4) 使用 PHP 连接器的校验功能,在服务器端验证冲突事件。更多细节请参见 data validation 相关文章。
如果校验失败,您可以在客户端重新加载数据。
要处理校验失败,请使用 DataProcessor 的 onValidationError 和 onAfterUpdate 事件,并通过调度器方法 clearAll 和 load 重新加载数据:
在发生校验错误后、数据发送前触发:
dp.attachEvent("onValidationError", function(id, details){
//从服务器重新加载最新数据
scheduler.clearAll();
scheduler.load("/data");
});
参数说明:
在服务器响应处理完成后触发:
dp.attachEvent("onAfterUpdate", function(id, action, tid, response){
if(action == "invalid" || action == "error"){
//从服务器重新加载最新数据
scheduler.clearAll();
scheduler.load("/data");
}
});
参数说明:
可能的响应状态包括: