<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
。
答案 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人员的增强请求。