2013-02-21 6 views
3

У меня есть страница, которая включает в себя контент из другой страницы динамически (это делается с помощью метода в компоненте)Dynamic UI включает в себя и CommandButton

firstPage.xhtml

<ui:include src="#{managedBean.pageView}"> 
    <ui:param name="method" value="#{managedBean.someAction}"/> 
</ui:include> 

Это перенаправляет на secondPage, который находится в пределах <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 не работает.

Любая помощь должна быть высоко оценена.

+0

Попробуйте 'actionListener' атрибут вместо' action'. В методах действий требуется возвращаемое значение, которое может быть преобразовано в строку. –

+0

Да, я тоже это пробовал, и это работает ... – sciFi

+0

Способы действий могут отлично вернуть 'void'. Это обрабатывается так же, как и возвращаемое значение «null». – BalusC

ответ

9

Вы не можете передавать выражения метода через <ui:param>. Они интерпретируются как выражение ценности.

Вы имеете в основном 3 варианта:

  1. Split экземпляра компонента и имя метода более 2 параметров:

    <ui:param name="bean" value="#{managedBean}" /> 
    <ui:param name="method" value="someAction" /> 
    

    и соедини их в файл тегов с помощью скобок обозначения [] следующим :

    <p:commandButton action="#{bean[method]}" value="Submit" /> 
    

  2. Создайте обработчик тега, который преобразует выражение значения в выражение метода. В библиотеке утилиты JSF OmniFaces есть <o:methodParam>, которая делает это. Используйте его как следует в файле тегов:

    <o:methodParam name="action" value="#{method}" /> 
    <p:commandButton action="#{action}" value="Submit" /> 
    

  3. Используйте composite component вместо этого. Вы можете использовать <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}" /> 
    
+0

Извините, метод был actionListener. И так как я вынужден использовать простые шрифты, у меня нет выбора использования всемогущих. Любые другие варианты или варианты, пожалуйста? – sciFi

+3

Просто измените 'action' в ответ на' actionListener', в котором вы действительно нуждаетесь? Почему вы думаете, что PrimeFaces и OmniFaces нельзя использовать вместе? OmniFaces - это библиотека утилиты, а не библиотека компонентов, такая как PrimeFaces/RichFaces. Более того, приложение витрины OmniFaces использует PrimeFaces для пользовательского интерфейса.Обратите внимание, что я упомянул 3 варианта, из которых 2 не используют OmniFaces. Также обратите внимание, что OmniFaces является открытым исходным кодом в соответствии с лицензией Apache. – BalusC

+0

'@ balus' Это то, что когда метод bean указан в src' ', тогда этот метод всегда вызывается перед другими методами (при рендеринге страницы)? – sciFi

 Смежные вопросы

  • Нет связанных вопросов^_^