JSF - Защо сетерът не се извиква този път?

Както обикновено, имам някои проблеми, като използвам някакво ajax повикване на заявен боб с обхват.

Имам този Bean:

@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

„:“ в началото на id във вашия f:ajax render атрибут се отнася за напълно квалифициран или абсолютен id, но стойността, която поставяте там, не е абсолютна.

Променете стойността на атрибута за изобразяване, за да бъде относителна:

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