如何在 update() 调用后将自定义扩展器逻辑重新应用到 PrimeFaces p:schedule?

问题描述 投票:0回答:1

我在 JSF 应用程序中使用 PrimeFaces

p:schedule
组件和自定义 JavaScript 扩展器,该扩展器使用 FullCalendar 中的
eventContent 
属性向每个事件添加附加内容。但是,我面临着一个由两部分组成的问题,即在更新后保持应用此扩展程序逻辑。

问题分解:

  1. 从支持 Bean 重新生成 JavaScript: 我从支持 Bean 动态生成扩展器 JavaScript,如下所示:

<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 
都不会重新渲染。

  1. 在计划更新后重新应用扩展器逻辑: 当我调用
    PF('myScheduleWidgetVar').update()
    刷新计划时,它会有效地获取事件数据,而无需完全重新渲染,这意味着我用于修改
    eventContent
    的自定义扩展器逻辑不会在每次更新后自动重新应用更新。

文档洞察 根据 PrimeFaces 文档:

“Schedule 提供了简单的客户端 API 和更新方法。每当您调用 update 时,schedule 都会查询其服务器端 ScheduleModel 实例来检查更新...这种方法比使用常规 PPR 更新要有效得多。”

鉴于

update()
不会触发完全重新渲染,我的扩展器逻辑需要在每次更新后重新应用。

问题

我该怎么办:

  1. 确保
    generateJsCustomization()
    中生成的JavaScript在每次更新后重新渲染在页面上?
  2. 在调用
    p:schedule
    后,将扩展器逻辑重新应用到
    eventContent
    组件以添加自定义
    update()

任何有关如何有效处理此问题的两个部分的建议将不胜感激!

jsf primefaces schedule
1个回答
0
投票

另一个选项,即使@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 解决方案听起来像是适合您的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.