Передать метод actionListener в commandButton внутри компонента

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

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

@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 (и если да, то как)?

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

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


person the dude    schedule 27.04.2012    source источник


Ответы (1)


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

<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 для этого.

person Mikita Belahlazau    schedule 27.04.2012
comment
Спасибо Никита! Кажется, это хороший способ сделать это! В любом случае, у меня есть некоторые проблемы с передачей метода компоненту, это означает, что при передаче myAction="#{myBean.myAction}" он всегда ищет атрибут, а не метод, для отладки я пробовал myAction="#{myBean.myAction(event)}", и вызов был передан метод, да! Но в myAction(ActionEvent event){ event было пустым ... есть идеи, могу ли я получить доступ/передать event из контекста выражения? Спасибо, в любом случае! - person the dude; 27.04.2012
comment
Проверьте docs.oracle.com/javaee /6/javaserverfaces/2.1/docs/vdldocs/ . Вы можете попробовать добавить <composite:actionSource name="myAction" />, а затем использовать так: <f:actionListener for="myAction" binding="#{bean.allEventsListener}" /> - person Mikita Belahlazau; 27.04.2012