加载ajax的数据表中的命令按钮不会调用它们的动作

时间:2012-07-04 19:39:58

标签: jsf

我有一个dataTable。 dataTable的数据通过ajax填充。表的一行包含诸如按钮之类的元素。 datatTable中的按钮应引用另一个页面,但如果我单击它们,则会重新加载当前页面。

这里有一些代码:

支持bean:

@ManagedBean(name="bean")
@SessionScoped
public class Bean {

private List<String> data;

@PostConstruct
public void postConstruct() {
    data = new ArrayList<String>();

}

public void fillTable() {
    data.add("E1");
    data.add("E2");
    data.add("E3");
}

public String outcome(){
    return "/faces/test/edit.jsf";
}

public List<String> getData() {
    return data;
}

public void setData(List<String> data) {
    this.data = data;
}

}

页面:

 <!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:h="http://java.sun.com/jsf/html" >
<h:body>
<h:form id="form">
<h:commandButton value="fillTable">
    <f:ajax listener="#{bean.fillTable()}" render="@form"/>
</h:commandButton>
<h:dataTable id="table" var="data" value="#{bean.data}">
    <h:column>
        <h:outputText value="#{data}" />
    </h:column>
    <h:column>
        <h:commandButton value="edit" action="#{bean.outcome}" />
    </h:column>
</h:dataTable>
</h:form>
</h:body>
</html>

我知道这有一些事情要做,表单已经在dom中,并且按钮被延迟加载到页面中(如果有人可能更具体,我会非常高兴)。

虽然如果我将支持bean的Scope更改为SessionScope,它可以工作。该按钮重定向到右侧页面。为什么呢?

1 个答案:

答案 0 :(得分:4)

  

虽然如果我将支持bean的Scope更改为SessionScope,它可以工作。该按钮重定向到右侧页面

bean应该放在视图范围内。会话范围过于宽泛,只有在同一会话中的多个浏览器窗口/选项卡中打开相同视图时,才会冒不正常行为的风险。

解释如下:当提交表单时,JSF需要识别按下的命令按钮以调用相关的操作方法。由于命令按钮位于数据表的一侧,因此JSF需要首先迭代其数据模型。但是,如果数据模型已更改或为空,则JSF将无法识别命令按钮。因此,不会调用该操作。

当bean在请求范围内时,它将在响应结束时被删除,并在每个新请求期间重新创建,包括ajax请求。所有bean的属性显然都会再次获得默认值,因此您的data属性也是如此。

另见: