p:inplace在验证失败时仍然切换回来

时间:2015-04-20 18:50:56

标签: jsf primefaces edit-in-place

我是PrimeFaces的新手,当我尝试将<p:inplace><f:facet>用于多个输入字段时,即使验证失败,它仍会切换回来。

代码如下:

<p:inplace editor="true">
  <f:facet name="output">
    <h:outputText value="Hello Inplace" />
  </f:facet>
  <f:facet name="input">
    <p:inputText value="#{myBean.name}" required="true" />
    <p:inputText value="#{myBean.age}" required="true" />
  </f:facet>
</p:inplace>

因此,当我将2个输入字段留空时,它仍然会切换回输出面,而它应该保持相同的红色边框。 请帮帮我。谢谢。

1 个答案:

答案 0 :(得分:2)

我相信inplace.isValid()中存在一个与使用facet相关的错误,因为我看到了同样的问题。以下是InplaceRenderer中encodeMarkup方法的相关代码。正如您所看到的那样确实期望输入和输出的命名方面。

protected void encodeMarkup(FacesContext context, Inplace inplace) throws IOException {
    // ...

    boolean validationFailed = context.isValidationFailed() && !inplace.isValid();
    String displayStyle = validationFailed ? "none" : "inline";
    String contentStyle = validationFailed ? "inline" : "none";

    UIComponent outputFacet = inplace.getFacet("output");
    UIComponent inputFacet = inplace.getFacet("input");

    // ...
}

您可以在此处查看完整代码:https://github.com/primefaces/primefaces/blob/master/src/main/java/org/primefaces/component/inplace/InplaceRenderer.java

在InplaceTemplate中查看isValid,它看起来只是尝试对就地的直接子进行验证而不会通过其他后代递归(除非getFacetsAndChildren展平后代树,我现在正在研究它)。由于facets不是EditableValueHolder的实例,因此它甚至不会尝试对它们进行验证并返回true。这是整个isValid方法。

public boolean isValid() {
    boolean valid = true;

    for(Iterator<UIComponent> it = this.getFacetsAndChildren(); it.hasNext();) {
        UIComponent component = it.next();
        if(component instanceof EditableValueHolder && !((EditableValueHolder) component).isValid()) {
            valid = false;
            break;
        }
    }

    return valid;
}

您可以在https://github.com/primefaces/primefaces/blob/master/src/main/java-templates/org/primefaces/component/inplace/InplaceTemplate.java

查看完整代码

我不知道除了提交错误之外还有解决方案。

修改

<p:inplace id="inplace" editor="true">
    <f:facet name="output">
        <h:outputText value="#{bean.value}" />
    </f:facet>
    <f:facet name="input">
        <p:inputText id="input" value="#{bean.value}" required="true" requiredMessage="Required field message goes here" />
        <p:message for="input" />
    </f:facet>
</p:inplace>

将它更新为类似的东西使我们更接近,因此可能在方面内有多个组件是问题。

<p:inplace id="inplace" editor="true">
    <p:ajax event="save" update="message" />
    <f:facet name="output">
        <h:outputText value="#{bean.value}" />
    </f:facet>
    <f:facet name="input">
        <p:inputText id="input" value="#{bean.value}" required="true" requiredMessage="Required field message goes here" />
    </f:facet>
</p:inplace>
<p:message id="message" for="input" />

不幸的是,在点击取消时仍然需要重置字段和消息,但至少这对我们来说是朝着正确方向迈出的一步。