Jsf p:自动更新设置为true的向导和消息组件

Jsf p:自动更新设置为true的向导和消息组件,jsf,primefaces,wizard,Jsf,Primefaces,Wizard,执行最后一步后,需要在和/或上显示消息,然后再转发回第一步,如下所示(向导执行三个步骤) bean中action()方法中设置为message的FacesMessage会出现很短一段时间,然后突然消失,就像轻弹一样(在当前示例中,我通过在中间添加一个警报框使其暂停) 罪魁祸首是的oncomplete处理程序中的JavaScript代码 这会将向导从最后一步转发回第一步,导致自动更新的组件消失 忽略自动更新(即将其设置为false)在实际项目中不是一个选项,在本身不负责执行此任务的情况下,将忽略自

执行最后一步后,需要在
和/或
上显示消息,然后再转发回第一步,如下所示(向导执行三个步骤)

bean中
action()
方法中设置为
message
FacesMessage
会出现很短一段时间,然后突然消失,就像轻弹一样(在当前示例中,我通过在中间添加一个警报框使其暂停)

罪魁祸首是
oncomplete
处理程序中的JavaScript代码

这会将向导从最后一步转发回第一步,导致自动更新的
组件消失

忽略自动更新(即将其设置为
false
)在实际项目中不是一个选项,在
本身不负责执行此任务的情况下,将
忽略自动更新
设置为
true
也没有帮助

如何防止该代码更新
组件,使其一致地显示所述消息



应该真正注意的是,在实际情况中,
的一开始就被放置在主模板上,目的是显示与从服务层抛出的一些异常相对应的一些全局消息,如
javax.persistence.OptimisticLockException
。因此,在
上应用某些条件将对该组件产生全局影响-需要根据PF源代码独立于

执行某些操作,
的影响ignoreAutoUpdate=“true”
可以通过向ajax回发提供
primefaces.ignoreautoupdate=true
请求参数来实现。但是,我没有看到一种简单的方法可以在不破坏JS源代码的情况下将其传递给
loadStep()
函数

我可以想出一个变通办法,在JS范围内设置一些布尔值,并在
pfAjaxSend
DOM事件期间检查它,然后将所需的请求参数附加到ajax请求查询字符串中,如
options.data
所示。为了防止全局JS范围污染,我选择向全局
PrimeFaces
对象添加一个自定义属性

<p:commandButton ... oncomplete="PrimeFaces.ignoreAutoUpdate=true; PF('wizard').loadStep(PF('wizard').cfg.steps[0], true)" />
通过在ajax回发之前在JS中简单地设置
PrimeFaces.ignoreAutoUpdate=true
,它也可以在其他地方重用


这种方法可能值得向PF人员提出增强请求。

您能否详细说明这一点?如果
本身不负责执行此任务,将ignoreAutoUpdate设置为true也会有所帮助我也有点惊讶,为什么这段代码会清除自动更新的消息,即使
ignoreAutoUpdate
设置为
true
。可能您的PF版本不支持ignoreAutoUpdateIt是PrimeFaces 5.2。它确实支持该属性。它在其他地方起作用。以前也有一个,跟复制品有区别。我认为是loadStep做了一个额外的ajax调用。尝试在action()方法中设置它。如何调试并了解源代码中的这一特定内容是任何给定问题的根本原因?
@Named
@ViewScoped
public class Bean implements Serializable {

    private static final long serialVersionUID = 1L;

    public Bean() {}

    public void action() {
        FacesMessage message = new FacesMessage();
        message.setSeverity(FacesMessage.SEVERITY_INFO);
        message.setSummary("Message Summary");
        message.setDetail("Message from backing bean");
        FacesContext.getCurrentInstance().addMessage("message", message);
    }
}
PF('wizard').loadStep(PF('wizard').cfg.steps[0], true)
<p:commandButton ... oncomplete="PrimeFaces.ignoreAutoUpdate=true; PF('wizard').loadStep(PF('wizard').cfg.steps[0], true)" />
$(document).on("pfAjaxSend", function(event, xhr, options) {
    if (PrimeFaces.ignoreAutoUpdate) {
        options.data += "&primefaces.ignoreautoupdate=true";
        PrimeFaces.ignoreAutoUpdate = false;
    }
});