<h:datatable>在<h:column id =“”>上使用ajax重新呈现单个单元格</h:column> </h:datatable>

时间:2013-09-11 15:15:46

标签: ajax jsf-2 datatable cell render

在下面的示例中,我有一个单列表,其单元格中放置了输入字段。

输入字段的背景颜色按照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

1 个答案:

答案 0 :(得分:2)

这是因为数据表是一个重复的构造,它使用列组件来呈现数据表中的所有行。更具体地说,即使在输出(HTML)中你最终得到很多行,在JSF组件树中只有一个组件可以处理或渲染所有行,而在update属性中你只能指定一个组件ID,但不是特定HTML标记的客户端ID。有关可能更好的解释,请参阅this answer