Jsf Primefaces数据表更新在f:facet name=";标题“;不起作用

Jsf Primefaces数据表更新在f:facet name=";标题“;不起作用,jsf,primefaces,datatable,Jsf,Primefaces,Datatable,我想更新primefaces数据表的header方面中的一个按钮,但它不起作用。我复制了datatable外的按钮,一切正常 更新应该在触发datatable的筛选器事件时发生。我显式地更新了datatable、外部和内部按钮 其目的是在未设置过滤器时显示一个带有图标的按钮,在使用过滤器时显示另一个图标。在这个例子中,我简化了用例:当没有使用过滤器时,有一个打开的锁图标,如果我在过滤器中键入了一些东西,应该显示一个关闭的锁图标。要释放锁,必须单击按钮(我没有在datatable中删除过滤器) 据

我想更新primefaces数据表的header方面中的一个按钮,但它不起作用。我复制了datatable外的按钮,一切正常

更新应该在触发datatable的筛选器事件时发生。我显式地更新了datatable、外部和内部按钮

其目的是在未设置过滤器时显示一个带有图标的按钮,在使用过滤器时显示另一个图标。在这个例子中,我简化了用例:当没有使用过滤器时,有一个打开的锁图标,如果我在过滤器中键入了一些东西,应该显示一个关闭的锁图标。要释放锁,必须单击按钮(我没有在datatable中删除过滤器)

据我所知,我在标题内使用了正确的按钮ID。所以我不知道为什么这不起作用

我使用的是mojarra 2.2和primefaces 6

<h:form id="id_form">
    <p:dataTable
        id="id_table"
        value="#{stateController.names}"
        var="currentName">

        <p:ajax
            event="filter"
            listener="#{stateController.markLocked()}"
            update="id_table id_form:id_table:id_button_inside id_form:id_button_outside"/>

        <p:column
            filterBy="#{currentName}"
            filterMatchMode="contains">
            <f:facet name="header">
                <p:commandButton
                    id="id_button_inside"
                    action="#{stateController.markUnlocked()}"
                    icon="#{stateController.locked ? 'ui-icon-locked' : 'ui-icon-unlocked'}" 
                    update="id_form"/>
            </f:facet>
            <h:outputText value="#{currentName}" />
        </p:column>
    </p:dataTable>

    <p:commandButton
        id="id_button_outside"
        action="#{stateController.markUnlocked()}"
        icon="#{stateController.locked ? 'ui-icon-locked' : 'ui-icon-unlocked'}" 
        update="id_form"
        />
</h:form>

@Named(value=“stateController”)
@会议范围
公共类StateController实现可序列化
{
私有布尔锁;
私人名单名称;
@施工后
私有void init()
{
锁定=错误;
名称=新的ArrayList();
姓名。添加(“彼得”);
}
公共无效标记锁定()
{
锁定=真;
}
公共无效标记()
{
锁定=错误;
}
//省略getter+setter
}

我还尝试在一个单独的列中添加一个按钮。有了这个按钮(显示在数据表的每一行),一切都很好。

有点晚了,但也许有一天会有人发现它很有用

要解决Filou的问题,需要在dataTable外部定义remoteCommand,并使其更新dataTable的头方面

<p:remoteCommand name="rmtCommand" update="id_form:id_table:id_button_inside"/>
<p:dataTable
    id="id_table"
    value="#{stateController.names}"
    var="currentName">

    <p:ajax
        event="filter"
        listener="#{stateController.markLocked()}"
        oncomplete="rmtCommand()"/>

有点晚了,但也许有一天会有人发现它很有用

要解决Filou的问题,需要在dataTable外部定义remoteCommand,并使其更新dataTable的头方面

<p:remoteCommand name="rmtCommand" update="id_form:id_table:id_button_inside"/>
<p:dataTable
    id="id_table"
    value="#{stateController.names}"
    var="currentName">

    <p:ajax
        event="filter"
        listener="#{stateController.markLocked()}"
        oncomplete="rmtCommand()"/>


尝试将按钮包装在
中并更新它:
Hi@Artem,很抱歉回答晚了。我用按钮周围的
试过了,但结果与没有面板时相同:-(试着用
包装按钮并更新它:
嗨@Artem,很抱歉回答晚了。我用按钮周围的
试过了,但结果与没有面板时相同:-(