0

情况如下:

  1. 我有一个组件,它的值是我的 ViewScoped bean 的一个属性,它会生成一个 FacesMessage,它会在首次提交表单时出现一些错误
  2. 在随后的用户操作中,点击 ah:commandlink,它使用 f:ajax,并且它的 actionlistener 将组件设置为不再呈现
  3. 收到响应后,组件不再呈现(如预期的那样),但它的 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 来呈现我在示例中的内容不起作用。谢谢。

4

1 回答 1

1

输入组件在其渲染条件被切换之前被提交、处理和验证。<h:message>不知道关联的输入组件未呈现。您还想检查相同的渲染条件<h:message>

<h:message for="tv" rendered="#{testBean.testValRendered}" />
<h:inputText id="tv" ... rendered="#{testBean.testValRendered}" />
于 2013-04-08T17:38:38.850 回答