我<f:ajax>
<h:inputText>
<ui:repeat>
内的<h:outputText>
有问题。它成功地使用新值呈现<h:inputText>
,但不是<f:ajax>
(两者都绑定到同一属性)。但是,如果我将@form
更改为呈现@all
或index.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}}
这是如何引起的?如何解决?
答案 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>
,因为这些已经是默认设置,因此无需重复默认设置)