这是我的场景:
在支持的 bean 中具有 HtmlDataTable 对象绑定的 h:dataTable。在 ah:column 内的命令按钮触发的操作方法中为 HtmlDataTable 调用 getClientId 是给我数据表 ID 和行索引作为 clientId。如果数据表 id 是“表”,则 getClientId() 将返回表:0(或表:1、表:2 ...取决于命令按钮所在的行索引)
我希望得到'table'作为clientId,因为绑定的表总是相同的。
当我使用数据表之外的按钮调用相同的方法时,我得到“表”。这对我来说是正确的,但我不明白为什么如果动作来自 UIColumn 按钮,我会得到 table:rowIndex。
JSF 页面是:
<h:form prependId="false">
<h:dataTable id="table" value="#{sessionBean.dummyData}" var="row" binding="#{sessionBean.dataTable}">
<h:column>
<f:facet name="header">
ROW ID
</f:facet>
#{row.longValue()}
</h:column>
<h:column>
<f:facet name="header">
ACTION 1
</f:facet>
<h:commandButton id="btn1" value="REFRESH CLIENT FROM UIColumn" >
<f:ajax execute="@this" render="output" listener="#{sessionBean.testAction()}" />
</h:commandButton>
</h:column>
</h:dataTable>
<h:commandButton id="btn2" value="REFRESH CLIENT outside from data table" >
<f:ajax execute="@this" render="output" listener="#{sessionBean.testAction()}" />
</h:commandButton>
<h:outputText id="output" value="#{sessionBean.clientId}" />
</h:form>
支持豆:
@ManagedBean
@SessionScoped
public class SessionBean {
private List<Long> dummyData;
private String clientId;
private HtmlDataTable dataTable;
public SessionBean() {
dummyData = new ArrayList<Long>();
}
@PostConstruct
public void postConstruct(){
for(int i = 0; i < 5; i++){
dummyData.add(new Long(i));
}
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public void testAction(){
clientId = this.dataTable.getClientId();
}
public List<Long> getDummyData() {
return dummyData;
}
public void setDummyData(List<Long> dummyData) {
this.dummyData = dummyData;
}
public HtmlDataTable getDataTable() {
return dataTable;
}
public void setDataTable(HtmlDataTable dataTable) {
this.dataTable = dataTable;
}
}
提前致谢。我想知道这是否是正常的 JSF 行为。