f:ui中的ajax:重复渲染h:outputText但无法渲染/更新h:inputText

时间:2014-03-08 16:59:18

标签: ajax jsf jsf-2.2 uirepeat

<f:ajax> <h:inputText> <ui:repeat>内的<h:outputText>有问题。它成功地使用新值呈现<h:inputText>,但不是<f:ajax>(两者都绑定到同一属性)。但是,如果我将@form更改为呈现@allindex.xhtml,则可行。但我显然不希望/需要呈现整个表单。

我正在使用Mojarra 2.2.4。这是<h:form> <table> <ui:repeat var="line" value="#{myBean.lines}"> <tr> <td> <h:inputText value="#{line.number}"> <f:ajax event="change" execute="@this" render="desc1 desc2" listener="#{myBean.onChangeLineNumber(line)}"/> </h:inputText> </td> <td> <h:inputText id="desc1" value="#{line.desc}"/> <h:outputText id="desc2" value="#{line.desc}"/> </td> </tr> </ui:repeat> </table> </h:form>

@ViewScoped

这是public void onChangeLineNumber(Line line) { line.setDesc("Some new text " + System.currentTimeMillis()); } bean的相关位:

{{1}}

这是如何引起的?如何解决?

1 个答案:

答案 0 :(得分:3)

这是由Mojarra的<ui:repeat>状态管理中的一个错误导致的,根据我的同事Arjan Tijms报告的issue 3215修复了错误(实际上是针对一个完全不同的问题,修复恰好也恰好解决了你的问题)。该修复程序位于Mojarra 2.2.7。所以升级到至少那个版本应该这样做。

否则,最好的办法是将其替换为<h:dataTable>,该组件的设计完全符合基于集合呈现HTML表格的功能要求。它还节省了一些HTML样板。

<h:form>
    <h:dataTable value="#{myBean.lines}" var="line">
        <h:column>
            <h:inputText value="#{line.number}">
                <f:ajax render="desc1 desc2" listener="#{myBean.onChangeLineNumber(line)}"/>
            </h:inputText>
        </h:column>
        <h:column>
            <h:inputText id="desc1" value="#{line.desc}"/>
            <h:outputText id="desc2" value="#{line.desc}"/>
        </h:column>
    </h:dataTable>
</h:form>

(请注意,我已从event="change"删除了execute="@this"<f:ajax>,因为这些已经是默认设置,因此无需重复默认设置)