問題は、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が実行されるという問題が原因です。
この動作をどのように回避できますか、または私のコードの何が問題になっていますか?