Primefaces datatable update in f:facet name=“header” not working

隐身守侯 提交于 2020-07-23 17:25:38

问题


I want to update a button in the header facet of a primefaces datatable and it does not work. I copied the button outside the datatable everything works fine.

The update should happen when the filter event of the datatable gets fired. I explicitly update the datatable, the outside- and the inside-button.

The intention is to display a button with an icon when no filter is set and another icon when a filter is used. In this example I simplyfied the use case: when no filter is used there is a open-lock icon, if I type something in a filter a closed-lock icon should be displayed. To release the lock one has to click the button (I did not implement the deletion of the filter in the datatable).

From what I understand I use the correct ID of the button inside the header. So I do not know why this does not work?

I am using mojarra 2.2 and 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")
@SessionScoped
public class StateController implements Serializable
{
    private boolean locked;
    private List<String> names;

    @PostConstruct
    private void init()
    {
        locked = false;
        names = new ArrayList<>();
        names.add("peter");
    }
    public void markLocked()
    {
        locked = true;
    }
    public void markUnlocked()
    {
        locked = false;
    }
    // getter + setter omitted
}

I also tried to put a button in a separate column. With this button (which is displayed in every row of the datatable) everything works fine as well.


回答1:


It's a bit late, but maybe someone will find it useful some day.

To solve Filou's problem, you need to define remoteCommand outside dataTable and make it update dataTable's header facet.

<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()"/>


来源:https://stackoverflow.com/questions/38502051/primefaces-datatable-update-in-ffacet-name-header-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!