这是我的故宫:
A:dataTable,在后台bean中绑定一个HtmlDataTable对象。在由h: HtmlDataTable内的命令按钮触发的操作方法中,调用HtmlDataTable的HtmlDataTable将为数据表id和行索引提供clientId。如果数据表id为“table”,则getClientId()返回表:0(或表:1,表:2.取决于命令按钮所在的行索引)
由于绑定的表始终是相同的,所以我希望获得与clientId一样的“表”。
当我用数据表之外的按钮调用相同的方法时,我会得到“table”。这对我来说是正确的,但我不明白为什么如果动作来自一个UIColumn按钮,我将得到表格: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行为。
发布于 2014-10-29 13:05:15
我已经做了一些JSF代码挖掘,而且,是的,他们似乎有意设计它以这样的方式工作。在服务器上的JSF生命周期处理过程中,HtmlDataTable对象的HtmlDataTable不断变化,因为它包含“当前选定”行的索引。而且,在'Invoke Application‘生命周期阶段,在调用Ajax处理程序(即'testAction’方法)前不久,JSF框架将HtmlDataTable的行索引设置为与单击按钮所在的行对应。
据我所知,从JavaDoc的UIData::getClientId(FacesContext)方法(由HtmlDataTable继承)中,在clientId of UIData组件中包含行索引的基本原理是避免属于不同行的子组件之间的clientId冲突。
https://stackoverflow.com/questions/23618142
复制相似问题