以编程方式控制哪些组件应该更新ajax

时间:2013-09-05 15:15:17

标签: jsf jsf-2 ajax-update

我有一个复杂的表单,用户填写了几个字段,有两个选项:生成许可证文件或保存更改。如果用户单击生成许可证文件按钮而不保存更改,我会在生成许可证之前呈现一个带有错误消息的小组件,要求他保存。 要显示带有警告消息的组件,我想使用ajax来避免渲染整个页面只是为了呈现警告组件。当然,如果保存了更改,则不需要警告消息,我将用户重定向到另一个页面。 我在可更改字段上有一个更改侦听器,以检测何时进行了更改。我不知道的是条件执行。 “如果未保存则使用ajax进行渲染,如果已保存则使用重定向”部分。这是逻辑

if(saved){
  redirect();
}else{
  ajax.renderWarning()
}

- EDIT-- 我要添加更多信息因为我意识到我要把事情做得太开放了。 这是可更新字段的一个示例。

<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";
}

1 个答案:

答案 0 :(得分:3)

使用PartialViewContext#getRenderIds()获取可更新的客户端ID集合,这些客户端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" />
相关问题