问题是,如果在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会更新,但是panelgroup再次显示“null”。这是由于问题,“绑定方法”dynamicPanel在更新第一个和最后一个属性之前执行。
如何解决此问题或我的代码有什么问题?
答案 0 :(得分:2)
如果将属性immediate =“true”添加到输入元素,则将在“应用请求值”阶段应用这些值,因此在执行操作之前将显示这些值。您可能也可能不需要在commandButton上将immediate属性设置为true。