首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在从UIData.getClientId激发的操作方法中调用UIColumn的客户端id值错误

在从UIData.getClientId激发的操作方法中调用UIColumn的客户端id值错误
EN

Stack Overflow用户
提问于 2014-05-12 20:21:32
回答 1查看 344关注 0票数 0

这是我的故宫:

A:dataTable,在后台bean中绑定一个HtmlDataTable对象。在由h: HtmlDataTable内的命令按钮触发的操作方法中,调用HtmlDataTable的HtmlDataTable将为数据表id和行索引提供clientId。如果数据表id为“table”,则getClientId()返回表:0(或表:1,表:2.取决于命令按钮所在的行索引)

由于绑定的表始终是相同的,所以我希望获得与clientId一样的“表”。

当我用数据表之外的按钮调用相同的方法时,我会得到“table”。这对我来说是正确的,但我不明白为什么如果动作来自一个UIColumn按钮,我将得到表格:rowIndex。

JSF页面是:

代码语言:javascript
复制
 <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>

背豆:

代码语言:javascript
复制
@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行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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冲突。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23618142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档