p:autoUpdate设置为true的向导和消息组件

时间:2015-09-21 19:30:55

标签: jsf primefaces wizard

<p:wizard>需要在执行最后一步之后在<p:messages>和/或<p:growl>上显示消息,然后再转发回第一步(向导执行三个步骤)

<h:form id="form">
    <p:messages id="message" for="message" redisplay="false" showDetail="true" autoUpdate="true"/>

    <p:wizard widgetVar="wizard">
        <p:tab title="Tab 1"></p:tab>
        <p:tab title="Tab 2"></p:tab>

        <p:tab title="Tab 3">
            <p:commandButton process="@this"
                             oncomplete="alert('Message'); PF('wizard').loadStep(PF('wizard').cfg.steps[0], true)"
                             value="Submit"
                             actionListener="#{bean.action}"/>
        </p:tab>
    </p:wizard>
</h:form>

托管bean:

@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);
    }
}

bean中FacesMessage方法中设置为message的{​​{1}}会出现很短的时间,并且像电影一样突然消失(在当前示例中,我给出了通过在其间添加一个警告框来暂停。

罪魁祸首是action()的{​​{1}}处理程序中的JavaScript代码。

oncomplete

这会将向导转发回上一步的第一步,导致自动更新的<p:commandButton>组件消失。

忽略自动更新(即将其设置为PF('wizard').loadStep(PF('wizard').cfg.steps[0], true) )不是真实项目中的选项,也不会将<p:messages>设置为false,因为ignoreAutoUpdate本身不负责执行此任务。

如何防止该代码更新true组件,以便始终显示所述消息?

应该真实地注意到,在实际情况中,<p:commandButton><p:messages>的最开始处放置在主模板上,目的是显示一些全局消息,这些消息对应于从服务层,如<p:messages>。因此,在<h:body>上应用某些条件会影响该组件的全局 - 需要做的事情独立于javax.persistence.OptimisticLockException

1 个答案:

答案 0 :(得分:1)

基于PF源代码,可以通过向ajax回发提供ignoreAutoUpdate="true"请求参数来实现primefaces.ignoreautoupdate=true的效果。但是,在没有破解JS源代码的情况下,我没有看到将其传递给loadStep()函数的简单方法。

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

PrimeFaces
<p:commandButton ... oncomplete="PrimeFaces.ignoreAutoUpdate=true; PF('wizard').loadStep(PF('wizard').cfg.steps[0], true)" />

通过在ajax回发之前在JS中设置$(document).on("pfAjaxSend", function(event, xhr, options) { if (PrimeFaces.ignoreAutoUpdate) { options.data += "&primefaces.ignoreautoupdate=true"; PrimeFaces.ignoreAutoUpdate = false; } }); ,这种方式也可以在其他地方重复使用。

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