сначала, пожалуйста, простите мое невежество и неспособность использовать систему поиска (я клянусь, что искал долго и часто, но не нашел удовлетворительного ответа на эту проблему).Пропустите метод 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-компоненты (и если да, то как)?
Итак, я надеюсь, что существует возможное решение для решения общей проблемы с изменением вышеуказанной стратегии или, возможно, использование чего-то приятного и другого (в общем, я предпочитаю не использовать хаки или обходные пути, но хотел бы использовать то, что предназначено по структуре).
Спасибо, если кто-то найдет время указать мне путь! В случае, если этот вопрос уже существует, было бы неплохо перейти к соответствующей записи и удалить ее.
Спасибо Nikita! Это, кажется, хороший способ сделать это! Во всяком случае, у меня есть некоторые проблемы, чтобы фактически передать метод компоненту, означает, что когда pass 'myAction =" # {myBean.myAction} "' он всегда ищет _attribute_ не для метода, для отладки я попробовал 'myAction = # {myBean.myAction (event)} "', и вызов передан методу, да! Но в событии 'myAction (ActionEvent) {' 'событие было null ... любая идея, если я могу получить доступ/передать« событие »из выражения-контекста? Спасибо, в любом случае! –
Проверьте http://docs.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/composite/actionSource.html. Вы можете попробовать добавить ' ', а затем использовать вот так: ' ' –