1

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

每个 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"。或者 <h:panelGroup> 必须添加为 <h:column> 的直接子级(然后可以使用其 id 重新渲染)但是我的用例比这个简化的例子更复杂。如果可能,我想避免额外的标记和 html 嵌套。而且,当然,重新渲染整个表格不是一种选择。

那么,为什么不能重新渲染 <h:column> 呢?

提前致谢,

阿列克谢

PS:使用 MyFaces 2.1.12 和 Mojarra 2.1.24 测试

4

1 回答 1

2

这是因为数据表是一个重复结构,它使用列组件来呈现数据表中的所有行。更具体地说,即使在输出 (HTML) 中您最终有很多行,但在 JSF 组件树中只有一个组件负责或呈现所有行,并且在update属性中您只能指定组件 ID,但不能指定特定 HTML 标记的客户端 ID。请参阅此答案以获得更好的解释。

于 2013-09-11T17:34:40.890 回答