ui:repeat中的ajax渲染h:outputText,但无法渲染/更新h:inputText



我在<ui:repeat>内部的<h:inputText>上有<f:ajax>的问题。它成功地呈现了具有新值的<h:outputText>,但没有呈现<h:inputText>(两者都绑定到相同的属性)。但是,如果我将<f:ajax>更改为渲染@form@all,则可以正常工作。但我显然不想/不需要渲染整个表单。

我使用Mojarra 2.2.4。这是index.xhtml

<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 bean的相关部分:

public void onChangeLineNumber(Line line)
{
    line.setDesc("Some new text " + System.currentTimeMillis());
}

这是如何引起的,我该如何解决?

这是由Mojarra的<ui:repeat>状态管理中的错误引起的,该错误根据我的同事Arjan Tijms报告的问题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>

(注意,我从<f:ajax>中删除了event="change"execute="@this",因为它们已经是默认值,没有必要重复默认值)

相关内容

  • 没有找到相关文章

最新更新