>我有一个复杂的表单,用户在其中填写几个字段,并且有两个选项:生成许可证文件或保存更改。如果用户单击生成许可证文件按钮而不保存更改,我会渲染一个小组件,其中包含一条错误消息,要求他在生成许可证之前保存。为了显示带有警告消息的组件,我想使用 ajax 来避免渲染整个页面只是为了呈现警告组件。当然,如果保存了更改,则不需要警告消息,我将用户重定向到另一个页面。我在可更改字段上有一个更改侦听器来检测何时进行了更改。我不知道的是有条件的执行。"如果未保存,则使用 ajax 渲染,如果已保存,则重定向"部分。这是逻辑
if(saved){
redirect();
}else{
ajax.renderWarning()
}
--编辑--我将添加更多信息,因为我意识到我让事情变得过于开放。下面是可更新字段的一个示例。
<h:inputText name="computername3" value="#{agreement.licenseServerBeans[2].computerId}" valueChangeListener="#{agreement.fieldChange}">
<rich:placeholder value="Add Computer ID"/>
</h:inputText>
fieldChange() bean 方法
public void fieldChange(ValueChangeEvent event) {
change = true; //change is a boolean, obviously :P
}
这是生成许可证按钮 jsf
<h:commandLink action="#{agreement.generateLicenseFile}">
<span class="pnx-btn-txt">
<h:outputText value="Generate License File" escape="false" />
</span>
</h:commandLink>
这是 generateLicenseFile() 方法
public String generateLicenseFile(){
....//lots of logic stuff
return "/licenseGenerated.xhtml?faces-redirect=true";
}
PartialViewContext#getRenderIds()
获取一个可变的客户端 ID 集合,这些集合应该在当前 ajax 请求上更新(它与您在 <f:ajax render>
中指定的完全相同,但随后以不带:
前缀的绝对客户端 ID 的形式):
if (saved) {
return "/licenseGenerated.xhtml?faces-redirect=true";
}
else {
FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("formId:messageId");
return null;
}
返回null
会导致它重新显示相同的视图。您甚至可以将其添加为全局人脸消息,并让 ajax 命令引用渲染中的<h:messages>
。
if (saved) {
return "/licenseGenerated.xhtml?faces-redirect=true";
}
else {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(...));
return null;
}
跟
<h:messages id="messages" globalOnly="true" />
...
<f:ajax render="messages" />