【发布时间】: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
}
我还尝试将按钮放在单独的列中。使用此按钮(显示在数据表的每一行中)一切正常。
【问题讨论】:
-
尝试将按钮包裹在
<p:outputPanel id="wrapper">并更新它:<p:ajax event="filter" update=":id_form:id_table:wrapper"... -
嗨@Artem,抱歉回答迟了。我在按钮周围使用
<p:outputPanel />进行了尝试,但结果与没有面板时相同:-(
标签: jsf primefaces datatable