0

这是我的场景:

在支持的 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 行为。

4

1 回答 1

1

我已经完成了一些 JSF 代码挖掘,是的,他们似乎有意将其设计为以这种方式工作。在服务器端 JSF 生命周期处理过程中,HtmlDataTable 对象的 clientId 不断变化,因为它包含了“当前选中”行的索引。而且,在“调用应用程序”生命周期阶段,在调用 Ajax 处理程序(即“testAction”方法)之前不久,JSF 框架将 HtmlDataTable 的行索引设置为与单击按钮所在的行相对应。

据我了解,从UIData::getClientId(FacesContext)方法(由 HtmlDataTable 继承)的 JavaDoc 中,将行索引包含在 UIData 组件的 clientId 中的基本原理是避免属于的子组件之间的 clientId 冲突到不同的行。

于 2014-10-29T13:05:15.897 回答