【问题标题】:Primefaces datatable update in f:facet name="header" not workingf:facet name="header" 中的 Primefaces 数据表更新不起作用
【发布时间】:2016-07-21 10:41:45
【问题描述】:

我想更新 primefaces 数据表标题方面的按钮,但它不起作用。我将按钮复制到数据表之外,一切正常。

更新应该在数据表的过滤器事件被触发时发生。我明确更新了数据表、外部和内部按钮。

目的是在未设置过滤器时显示带有图标的按钮,在使用过滤器时显示另一个图标。在此示例中,我简化了用例:当不使用过滤器时,会有一个开锁图标,如果我在过滤器中键入内容,则应该显示一个闭锁图标。要释放锁定,必须单击按钮(我没有实现删除数据表中的过滤器)。

据我了解,我在标题中使用了正确的按钮 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")
@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
}

我还尝试将按钮放在单独的列中。使用此按钮(显示在数据表的每一行中)一切正常。

【问题讨论】:

  • 尝试将按钮包裹在&lt;p:outputPanel id="wrapper"&gt; 并更新它:&lt;p:ajax event="filter" update=":id_form:id_table:wrapper"...
  • 嗨@Artem,抱歉回答迟了。我在按钮周围使用&lt;p:outputPanel /&gt; 进行了尝试,但结果与没有面板时相同:-(

标签: jsf primefaces datatable


【解决方案1】:

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

解决Filou的问题,需要在dataTable外面定义remoteCommand,让它更新dataTable的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()"/>

【讨论】:

    猜你喜欢
    • 2014-01-09
    • 1970-01-01
    • 2016-04-07
    • 2018-03-11
    • 2011-12-31
    • 2012-11-19
    • 2014-03-17
    • 2012-11-07
    • 2015-03-26
    相关资源
    最近更新 更多