情况如下:
- 我有一个组件,它的值是我的 ViewScoped bean 的一个属性,它会生成一个 FacesMessage,它会在首次提交表单时出现一些错误
- 在随后的用户操作中,点击 ah:commandlink,它使用 f:ajax,并且它的 actionlistener 将组件设置为不再呈现
- 收到响应后,组件不再呈现(如预期的那样),但它的 FacesMessage 仍然保留并显示
我正在使用 Mojarra JSF 2.1 和 IceFaces 3.0 - 尽管仅使用标准 JSF 组件才能看到此示例和有问题的行为。这是一个演示该行为的小示例:
测试.xhtml
<h:form id="testform">
<h:message for="tv"/>
<h:inputText id="tv" value="#{testBean.testVal}" rendered="#{testBean.testValRendered}" required="true" />
<h:commandButton value="Submit"/>
<h:commandLink actionListener="#{testBean.toggleTestVal}" value="Toggle input">
<f:ajax execute="@this" render="@form"/>
</h:commandLink>
</h:form>
豆码
@ViewScoped
@ManagedBean(name = "testBean")
public class TestBean {
private String testVal;
private boolean testValRendered;
public TestBean() {
testValRendered = true;
}
public String getTestVal() {
return testVal;
}
public void setTestVal(String testVal) {
this.testVal = testVal;
}
public boolean isTestValRendered() {
return testValRendered;
}
public void setTestValRendered(boolean testValRendered) {
this.testValRendered = testValRendered;
}
public void toggleTestVal(ActionEvent ae) {
testValRendered = !testValRendered;
}
}
如果我更改 h:commandLink 使其不使用 f:ajax,并在其上设置 immediate='true',则消息将被正确删除。虽然这在某些情况下可能有效,但我想了解为什么使用 f:ajax 来呈现我在示例中的内容不起作用。谢谢。