我在 JSF 应用程序中使用 PrimeFaces
p:schedule
组件和自定义 JavaScript 扩展器,该扩展器使用 FullCalendar 中的 eventContent
属性向每个事件添加附加内容。但是,我面临着一个由两部分组成的问题,即在更新后保持应用此扩展程序逻辑。
问题分解:
<h:panelGroup id="scriptPanel">
<script type="text/javascript">
#{appointmentsController.generateJsCustomization()}
</script>
</h:panelGroup>
public String generateJsCustomization() {
ScheduleConfig config = new ScheduleConfig(
"", // dayCellContent
"", // slotLaneContentDay
"", // slotLaneContentWeek
scheduleConfig.getBusinessHours() // businessHours
);
this.jsExtenderCode = JavaScriptGenerator.generateCustomizeSchedule(config,
appointments.stream()
.flatMap(appointment -> appointment.getPatientAppointments().stream())
.collect(Collectors.toList())
);
return this.jsExtenderCode;
}
JavaScript 扩展函数 (
jsExtenderCode
) 已正确生成,但是当我更新计划时,生成的 JavaScript 不会在页面上重新呈现。似乎每次更新时 scriptPanel
都不会重新渲染。
PF('myScheduleWidgetVar').update()
刷新计划时,它会有效地获取事件数据,而无需完全重新渲染,这意味着我用于修改 eventContent
的自定义扩展器逻辑不会在每次更新后自动重新应用更新。文档洞察 根据 PrimeFaces 文档:
“Schedule 提供了简单的客户端 API 和更新方法。每当您调用 update 时,schedule 都会查询其服务器端 ScheduleModel 实例来检查更新...这种方法比使用常规 PPR 更新要有效得多。”
鉴于
update()
不会触发完全重新渲染,我的扩展器逻辑需要在每次更新后重新应用。
问题
我该怎么办:
generateJsCustomization()
中生成的JavaScript在每次更新后重新渲染在页面上?p:schedule
后,将扩展器逻辑重新应用到 eventContent
组件以添加自定义 update()
?任何有关如何有效处理此问题的两个部分的建议将不胜感激!
另一个选项,即使@BalusC建议很棒,你也可以覆盖 Schedule
update
小部件方法来在调用后调用你的扩展程序。
if (PrimeFaces.widget.Schedule) {
PrimeFaces.widget.Schedule.update = function() {
this.calendar.refetchEvents();
if (this.cfg.extender) {
this.cfg.extender.call(this);
}
}
}
虽然听起来您需要先更新扩展程序脚本,但使用
<p:autoUpdate />
的 @BalusC 解决方案听起来像是适合您的解决方案。