Динамический интерфейс включает и commandButton
У меня есть страница, которая динамически включает в себя содержимое с другой страницы (это делается с помощью метода в компоненте)
firstPage.xhtml
<ui:include src="#{managedBean.pageView}">
<ui:param name="method" value="#{managedBean.someAction}"/>
</ui:include>
Это перенаправляет на второй странице, которая находится в <ui:composition>
у которого есть commandButton.
secondPage.xhtml
<ui:composition>
..
..
<p:commandButton actionListener=#{method} value="Submit"/>
</ui:composition>
ManagedBean
public String pageView(){
return "secondPage.xhtml";
}
public void someAction(){
*someAction*
}
CommandButton в secondPage.xhtml не работает.
Любая помощь будет высоко ценится.
1 ответ
Вы не можете передавать выражения метода через <ui:param>
, Они интерпретируются как выражение значения.
У вас есть в основном 3 варианта:
Разделите экземпляр компонента и имя метода на 2 параметра:
<ui:param name="bean" value="#{managedBean}" /> <ui:param name="method" value="someAction" />
И соедините их в файле тегов, используя скобки
[]
следующее:<p:commandButton action="#{bean[method]}" value="Submit" />
Создайте обработчик тега, который преобразует выражение значения в выражение метода. Утилита JSF OmniFaces имеет
<o:methodParam>
который делает это. Используйте его следующим образом в файле тегов:<o:methodParam name="action" value="#{method}" /> <p:commandButton action="#{action}" value="Submit" />
Вместо этого используйте составной компонент. Ты можешь использовать
<cc:attribute method-signature>
определить методы действия как атрибуты.<cc:interface> <cc:attribute name="method" method-signature="void method()"/> </cc:interface> <cc:implementation> <p:commandButton action="#{cc.attrs.method}" value="Submit"/> </cc:implementation>
Который используется следующим образом:
<my:button method="#{managedBean.someAction}" />