JSF 2 f: проблема жизненного цикла ajax

Проблема заключается в том, что если свойство изменяется во время запроса f:ajax, а связанная группа panelGroup должна быть создана заново в зависимости от этого измененного значения, используется старое значение.

Этот код объяснит проблему.

Вот backingbean TestBean:

public String getFirst() {
        return first;
    }
    public void setFirst(String first) {
        this.first = first;
    }
    public String getLast() {
        return last;
    }
    public void setLast(String last) {
        this.last = last;
    }

    public String getName(){
        return first+" "+last; 
    }
public void setDynamicPanel(HtmlPanelGroup panel){ }

    public HtmlPanelGroup getDynamicPanel(){
        Application app = FacesContext.getCurrentInstance().getApplication();
        HtmlPanelGroup component = (HtmlPanelGroup)app.createComponent(HtmlPanelGroup.COMPONENT_TYPE);

        HtmlOutputLabel label1 = (HtmlOutputLabel)app.createComponent(HtmlOutputLabel.COMPONENT_TYPE);
        label1.setValue(" --> "+getFirst()+" "+getLast());
        component.getChildren().add(label1);
        return component;
    }

а теперь код jsf/facelet:

<h:form id="form">
    <h:panelGrid columns="1">
        <h:inputText id="first" value="#{testBean.first}" />
        <h:inputText id="last" value="#{testBean.last}" />
        <h:commandButton value="Show">
            <f:ajax execute="first last" render="name dyn" />
        </h:commandButton>
    </h:panelGrid>
    <h:outputText id="name" value="#{testBean.name}" />
    <h:panelGroup id="dyn" binding="#{testBean.dynamicPanel}" />
</h:form>

После того, как страница была первоначально загружена, outputText и panelGroup показывают как "null" как первый, так и последний. Но после нажатия кнопки outputText хорошо обновляется, но группа панелей снова показывает только «null». Это связано с тем, что "связанный метод" dynamicPanel выполняется до обновления первого и последнего свойств.

как можно обойти это поведение или что не так с моим кодом?


person gerry    schedule 21.05.2010    source источник


Ответы (1)


Если вы добавите атрибут немедленное = «true» к своим элементам ввода, значения будут применяться на этапе «Применить значения запроса» и, следовательно, будут присутствовать до выполнения вашего действия. Вам также может понадобиться или не понадобиться, чтобы для свойства commandButton было установлено значение true для немедленного атрибута.

person Brian Leathem    schedule 27.05.2010
comment
Есть ли в этом недостатки? Вводит ли использование immediate="true" какие-то дополнительные необходимые приемы или оно удаляет поддержку какой-то вещи X? - person Tuukka Mustonen; 18.08.2010
comment
Это означает, что вы пропускаете проверку для этого ввода. Это может быть плохо, если вам нужно исправить данные в непосредственном свойстве резервного компонента. Например, если вы хотите, чтобы входные элементы были целыми числами или что-то в этом роде. - person Brian Leathem; 07.09.2010