2012-04-27 3 views
0

сначала, пожалуйста, простите мое невежество и неспособность использовать систему поиска (я клянусь, что искал долго и часто, но не нашел удовлетворительного ответа на эту проблему).Пропустите метод actionListener для commandButton внутри компонента

У меня есть компонент, реализующий совместимый метод действия слушающего:

@ManagedBean(name = "myBean") 
@ViewScoped 
class Bean{ 
    public String myAction(ActionEvent event){ 
     ... = event.getComponent().getAttributes().get("something"); 
    } 
} 

Тогда у меня есть JSF компонент, как это:

<composite:interface> 
    <composite:attribute name="actionBean" required="true"/> 
    <composite:attribute name="actionMethod" method-signature="void myAction(javax.faces.event.ActionEvent)" /> 
</composite:interface> 
<composite:implementation> 
     <h:form> 
      <p:commandButton actionListener="#{cc.attrs.actionBean[cc.attrs.actionMethod]}"> 
       <f:attribute name="something" value="somevalue" /> 
      </p:commandButton> 
     </h:form> 
</composite:implementation> 

Это называется что-то вроде этого:

<namespace:myComponent actionBean="#{myBean}" actionMethod="myAction" /> 

Я знаю, что этот звонок не работает, и мне интересно, как это сделать правильно!

Моей главной целью является то, что я хочу иметь относительно общий jsf-компонент (было бы хорошо, если бы оно было повторно использовано позже), в котором есть кнопка. При нажатии на эту кнопку я хочу передать объект (нет простой строки!) В случае строки я бы просто использовал action="..." и передал ее через f:param). С помощью метода actionListener я беру объект через event.getComponent().getAttributes().get("something").

Я думаю, что подпись void myAction(javax.faces.event.ActionEvent) является проблемой, которая прерывает передачу связанного метода с компонентом, не так ли? Можно ли вообще передавать метод с любым аргументом в jsf-компоненты (и если да, то как)?

Итак, я надеюсь, что существует возможное решение для решения общей проблемы с изменением вышеуказанной стратегии или, возможно, использование чего-то приятного и другого (в общем, я предпочитаю не использовать хаки или обходные пути, но хотел бы использовать то, что предназначено по структуре).

Спасибо, если кто-то найдет время указать мне путь! В случае, если этот вопрос уже существует, было бы неплохо перейти к соответствующей записи и удалить ее.

ответ

3

Попробуйте следующее:

<namespace:myComponent myAction="#{myBean.myAction}"/> 

И составной компонент:

<composite:interface> 
    <composite:attribute name="myAction" 
         required="true" 
         method-signature="void myAction(javax.faces.event.ActionEvent)" 
         targetAttributeName="actionListener"/> 
</composite:interface> 
<composite:implementation> 
    <h:form> 
     <p:commandButton id="myAction"> 
      <f:attribute name="something" value="somevalue" /> 
     </p:commandButton> 
    </h:form> 
</composite:implementation> 

Проверить composite:attribute документации. Он имеет несколько вариантов передачи слушателям составного компонента. Для этого я использовал targetAttributeName.

+0

Спасибо Nikita! Это, кажется, хороший способ сделать это! Во всяком случае, у меня есть некоторые проблемы, чтобы фактически передать метод компоненту, означает, что когда pass 'myAction =" # {myBean.myAction} "' он всегда ищет _attribute_ не для метода, для отладки я попробовал 'myAction = # {myBean.myAction (event)} "', и вызов передан методу, да! Но в событии 'myAction (ActionEvent) {' 'событие было null ... любая идея, если я могу получить доступ/передать« событие »из выражения-контекста? Спасибо, в любом случае! –

+0

Проверьте http://docs.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/composite/actionSource.html. Вы можете попробовать добавить '', а затем использовать вот так: '' –

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