2

問題は、f:ajaxリクエスト中にプロパティが変更され、その変更された値に応じてバインドされたpanelGroupを新しく作成する必要がある場合、古い値が使用されることです。

このコードは問題を説明します。

backingbeanTestBeanは次のとおりです。

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が実行されるという問題が原因です。

この動作をどのように回避できますか、または私のコードの何が問題になっていますか?

4

1 に答える 1

2

入力要素に属性immediate="true"を追加すると、値は「リクエスト値の適用」フェーズ中に適用されるため、アクションが実行される前に存在します。commandButtonでもimmediate属性をtrueに設定する必要がある場合とない場合があります。

于 2010-05-27T04:35:35.563 に答える