JSF - Почему на этот раз сеттер не вызывается?

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

У меня есть этот Бин:

@ManagedBean
@RequestScoped
public class ArticlesSelector implements Serializable {
    @ManagedProperty(value="#{param.type}")
    private String type;
    private String zone;
    private String order;

    @PostConstruct
    public void init() {
        if(type==null || type.trim().isEmpty()) { this.type="1"; }
        if(zone==null || zone.trim().isEmpty()) { this.zone="list"; }
        if(order==null || order.trim().isEmpty()) { this.order="1"; }
    }

    public String getType() { return type; }
    public void setType(String type) { this.type = type; }

    public String getZone() { return zone; }
    public void setZone(String zone) { this.zone=zone; }

    public String getOrder() { return order; }
    public void setOrder(String order) { this.order = order; }

    public ArrayList<String[]> getArticleList() {

        ...

        System.out.println("ORDER = "+this.order);

        ...
    }
}

Когда я делаю этот вызов:

<h:panelGroup layout="block" id="articlesContent">
    <h:form id="formArticles">
        <h:outputScript name="jsf.js" library="javax.faces" target="head" />
        <h:panelGroup rendered="#{articlesSelector.zone=='list'}">
            <h:panelGroup layout="block" id="articlesContentList">
                <h:commandLink>
                        <f:setPropertyActionListener target="#{articlesSelector.order}" value="2" />
                        <f:ajax event="click" render=":articlesContent"/>
                        <h:graphicImage value="img/arrow_down.png" alt="Arrow Down"/>
                    </h:commandLink>
                <h:outputLabel value="#{articlesSelector.articleList}" />                
            </h:panelGroup>
        </h:panelGroup>
    </h:form>
</h:panelGroup>  

Стоимость заказа всегда 1. Кажется, что метод установки не вызывается. На этот раз это не ошибка рендеринга, потому что это действие рендерится на этапах Применить запрос и Обновить модель (фактически, от System.out.println("ORDER = "+this.order); до #{articlesSelector.articleList} оно вызывается каждый раз, когда я нажимаю кнопку изображение). Итак, что случилось на этот раз?

Объем запроса заставляет меня немного нервничать :)

Спасибо


person markzzz    schedule 02.12.2010    source источник


Ответы (2)


f:ajax нужно стрелять по event="action", а не по event="click".

Да, я знаю, что когда-либо предлагал в комментарии к вашему вопросу использовать click, но я был явно не прав™. Извините за это :)

person BalusC    schedule 02.12.2010
comment
ОЙ! Хе-хе, не волнуйся!! Итак, есть разница между действием и кликом!! Что? :) - person markzzz; 02.12.2010
comment
Рано или поздно проверим и сообщим. - person BalusC; 02.12.2010
comment
На самом деле это нигде не задокументировано (или мне нужны новые очки), поэтому мне пришлось копаться в исходном коде JSF. Событие action работает только с компонентами UICommand и будет оцениваться как ActionEvent, которое выполнит action и actionListener компонента (если есть) и заберет с собой f:setPropertyActionListener. Другие события — это просто BehaviorEvent, которое сопоставляется с существующим событием HTML DOM и будет выполнять только метод, объявленный в атрибуте listener атрибута f:ajax, если таковой имеется, и игнорирует f:setPropertyActionListener, action и actionListener, если есть. - person BalusC; 02.12.2010

«:» в начале идентификатора в вашем атрибуте рендеринга f: ajax относится к полному или абсолютному идентификатору, но значение, которое вы указываете, не является абсолютным.

Измените значение атрибута рендеринга на относительное:

render="articlesContent"

или к абсолютному:

render=":articlesContent:formArticles:articlesContent"
person Brian Leathem    schedule 02.12.2010
comment
Не знаю, это может сработать. Я пытался. Но commandbutton находится в articlesContentList, и мне нужно отрендерить articlesContent. Вот почему я поставил : - person markzzz; 02.12.2010
comment
Да, на самом деле я мог написать только render="articlesContentList", но проблема все равно возникает :) - person markzzz; 02.12.2010