У нас есть требование разрешить пользователям настраивать порядок столбцов во всех типах данных, включая столбцы с кнопками действий на них, здесь p:commandButton
s.JSF/PrimeFaces: программный <f: setPropertyActionListener> on <p: commandButton> not firing
Следовательно, мы используем привязку для всех наших столбцов, которые мы должны создавать вручную. Для всех столбцов, которые отображают только некоторые строки, логические значения, даты и числа работают нормально, однако проблемы возникают при добавлении p:commandButton
s к столбцам, у которых есть один или несколько <f:setPropertyActionListener>
s.
ELContext elContext = FacesContext.getCurrentInstance().getELContext();
ExpressionFactory factory = FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
CommandButton button = new CommandButton();
button.setIcon("ui-icon ui-icon-pencil");
button.setProcess("@this");
button.setUpdate(":compliance-case-dialog :compliance-case-form:data");
button.setOncomplete("complianceCaseDialog.show();");
ValueExpression targetExpression = factory.createValueExpression(elContext, "#{complianceCaseManager.selectedComplianceCaseWithRefresh}", ComplianceCase.class);
ValueExpression valueExpression = factory.createValueExpression(elContext, "#{coca}", ComplianceCase.class);
button.addActionListener(new SetPropertyActionListenerImpl(targetExpression, valueExpression));
column.getChildren().add(button); // add to Column instance
Эта кнопка «правильно» отображает <p:dialog>
, но должен вызвать ComplianceCaseManager
класс setSelectedComplianceCaseWithRefresh(ComplianceCase selectedComplianceCase)
метод с текущим объектом DataTable в (как определено var="coca"
) перед показом диалога.
<p:dataTable id="data"
widgetVar="resultTable"
value="#{complianceCaseManager.complianceCases}"
var="coca"
...>
</p:dataTable>
Debugging показывает метод setSelectedComplianceCaseWithRefresh(ComplianceCase selectedComplianceCase)
никогда не вызывается.
Q:
Что случилось? Как вы это исправите?
PS: конфигурация является PrimeFaces 3.4.2, 2.1.22 Mojarra, GlassFish 3.1.2.2, Java 7
Update 1:
Вот р: CommandButton Я хочу, чтобы перевести к программным:
<p:commandButton icon="ui-icon ui-icon-pencil"
title="#{msg['complianceCaseManager.data.edit.button.hint']}"
process="@this"
update=":compliance-case-dialog :compliance-case-form:data"
oncomplete="complianceCaseDialog.show();">
<p:resetInput target=":unlocked-form" />
<f:setPropertyActionListener target="#{complianceCaseManager.selectedComplianceCaseWithRefresh}" value="#{coca}" />
<f:setPropertyActionListener target="#{complianceCaseManager.mode}" value="EDIT" />
</p:commandButton>
линия
<f:setPropertyActionListener target="#{complianceCaseManager.selectedComplianceCaseWithRefresh}" value="#{coca}" />
Это тот, который я должен получить, чтобы работать.
Решение по Kolossus создать MethodExpressionActionListener
не работает для моего кода:
String targetExpressionString = "#{complianceCaseManager.selectedComplianceCaseWithRefresh}";
String valueExpressionString = "#{coca}";
MethodExpression targetMethodExpression = factory.createMethodExpression(elContext, targetExpressionString, null, new Class<?>[]{ ComplianceCase.class });
MethodExpression valueMethodExpression = factory.createMethodExpression(elContext, valueExpressionString, ComplianceCase.class, new Class<?>[0]);
button.addActionListener(new MethodExpressionActionListener(targetMethodExpression, valueMethodExpression));
AFAIK сделан так, что на цели сеттер называется и по значению называется сеттер, так что я d предположим, что ValueExpression
s будет достаточным.
Update 2:
Попытки установить текущий объект через EL 2,2 вызов методы также не работает.
Код:
String methodExpressionString = "#" + "{complianceCaseManager.selectedComplianceCaseWithRefresh(coca)}";
MethodExpression methodExpression = factory.createMethodExpression(elContext, methodExpressionString, null, new Class<?>[]{ ComplianceCase.class });
button.addActionListener(new MethodExpressionActionListener(methodExpression));
Ничто не называется.
Update 3:
Вот правильный <:setPropertyActionListener>
код:
// traditional <f:setPropertyActionListener target="#{complianceCaseManager.selectedComplianceCaseWithRefresh}" value="#{coca}" />
ValueExpression targetExpression = factory.createValueExpression(elContext, "#{complianceCaseManager.selectedComplianceCaseWithRefresh}", ComplianceCase.class);
ValueExpression valueExpression = factory.createValueExpression(elContext, "#{coca}", ComplianceCase.class);
button.addActionListener(new SetPropertyActionListenerImpl(targetExpression, valueExpression));
Большое спасибо Kolossus. Не забудьте позвонить setId()
при создании экземпляра PrimeFaces CommandButton
.
ли вы установить 'id' атрибут? – kolossus
OMG. : -O Это действительно решило! Пожалуйста, разместите его как ответ. :-) – Kawu
Он уже там :) – kolossus