在下面的示例中,我有一个单列表,其单元格中放置了输入字段。
输入字段的背景颜色按照ajax更改为绿色(填充时)或红色(空白时)。
XHTML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core" xml:lang="en" lang="en">
<h:head>
</h:head>
<h:body>
<h:form>
<h:dataTable value="#{testBean.getData()}" var="row" id="table">
<h:column id="cell">
<h:inputText value="#{row[0]}" id="input" style="background-color:#{empty row[0] ? 'red' : 'green'}">
<f:ajax event="change" render="cell" />
</h:inputText>
</h:column>
</h:dataTable>
</h:form>
</h:body>
</html>
爪哇:
@ManagedBean(name="testBean")
@SessionScoped
public class TestBean {
public TestBean() {
super();
}
private static String [][] initdata = {{"test"},{null},{null},{null},{null}};
private List<String[]> data = Arrays.asList(initdata);
public List<String[]> getData() {
return data;
}
}
问题是,
<f:ajax event="change" render="cell" />
不起作用。为了使其工作,必须使用render =“input”。或者&lt; h:panelGroup&gt;必须添加为&lt; h:column&gt;的直接子项(然后它可以使用其id重新呈现)但是我的用例比这个简化的例子更复杂。如果可能的话,我想避免额外的标记和html嵌套。当然,重新渲染整个表格不是一种选择。
那么,为什么重新渲染&lt; h:column&gt;是不可能的?
提前致谢,
阿列克谢
PS:使用MyFaces 2.1.12测试&amp; Mojarra 2.1.24
答案 0 :(得分:2)
这是因为数据表是一个重复的构造,它使用列组件来呈现数据表中的所有行。更具体地说,即使在输出(HTML)中你最终得到很多行,在JSF组件树中只有一个组件可以处理或渲染所有行,而在update
属性中你只能指定一个组件ID,但不是特定HTML标记的客户端ID。有关可能更好的解释,请参阅this answer。