JSF 2 f: проблема жизненного цикла ajax - PullRequest
2 голосов
/ 21 мая 2010

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

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

Вот базовый тестовый бин:

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 отображают «ноль» как первый и последний. Но после нажатия кнопки выходной текст хорошо обновляется, но группа панелей снова показывает только «ноль». Это связано с тем, что динамический элемент «связанного метода» выполняется перед обновлением первого и последнего свойств.

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

1 Ответ

2 голосов
/ 27 мая 2010

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

...