f:ajax在ui:repeat中可以渲染h:outputText但不能渲染/更新h:inputText。

3
我在<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());
}

这是如何造成的,我应该如何解决?

请提供行代码和myBean类的代码。 - unleashed
1个回答

3
这是由Mojarra的<ui:repeat>状态管理中的一个错误引起的,根据问题3215的报告已经修复,我的同事Arjan Tijms报告了这个问题(实际上针对完全不同的问题进行了修复,恰好也解决了您的问题)。该修复程序可在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",因为它们已经是默认值,不需要重复。

我们必须使用 ui:repeat 而不是 h:dataTable,但我不记得原因了。谢谢你的回答! - Simon Arsenault

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接