我在处理PrimeFaces 5.0和带有"绑定"的panelGroup时遇到了一些麻烦。我知道,"绑定"糟透了,但我正在使用遗留系统并相信我,如果没有"绑定"它真的很难让它成为正确的方式。
所以,当我点击mi链接时,"绑定"在" action"之前调用属性,然后调用该操作,并在所有"更新"之后调用。但是,组件未正确更新。
即使我让它运行"动作"在绑定的getter之前,getter返回正确的东西,这个特定的组件不会更新。
我有更多没有绑定的组件正确更新,但没有#34;绑定"。
更新:
这是代码的其余部分。 flag以" false"开头值。
页面始终打印"只读"。
Somepage.xhtml
<h:form id="frm">
<p:commandLink value="#{messages.Guardar}" id="bt_Guardar" action="#{myBean.flagFalse}" update="someid" />
<p:commandLink value="#{messages.Editar}" id="bt_Editar" action="#{myBean.flagTrue}" update="someid" />
<h:panelGroup id="someid" layout="block">
<h:panelGroup id="panelCamposTD" layout="block" binding="#{myBean.someStuff}" ></h:panelGroup>
</h:panelGroup>
</h:form>
我的myBean,是一个 SessionScoped bean(因为它来自遗留系统)
@ManagedBean(name="myBean")
@SessionScoped
public class MyBean implements Serializable{
private static final long serialVersionUID = 7628440827777833854L;
private boolean flag = false;
public void flagFalse(){
flag = false;
}
public void flagTrue(){
flag = true;
}
public HtmlPanelGroup getSomeStuff(){
HtmlPanelGroup pg = new HtmlPanelGroup();
HtmlOutputText t = new HtmlOutputText();
if (flag){
t.setValue("EDITED");
}else{
t.setValue("READ ONLY");
}
pg.getChildren().add(t);
return pg;
}
public void setSomeStuff(HtmlPanelGroup pg){
return;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
答案 0 :(得分:0)
您应该避免使用会话范围绑定到托管bean。这可能会造成很多麻烦:
3.1.5组件绑定
[...]
组件绑定通常与通过Managed Bean Creation工具动态实例化的JavaBeans一起使用(请参见第5.8.1节“VariableResolver和Default VariableResolver”)。强烈建议应用程序开发人员在“请求”范围内放置由组件绑定表达式指向的托管bean。这是因为将它放在会话或应用程序范围中需要线程安全,因为UIComponent实例依赖于在单个线程内部运行。在“会话”范围内放置组件绑定时,对内存管理也可能产生负面影响。
有两种解决方案可以避免绑定:
在此解决方案中,输出文本始终可见,只是从支持的bean获取不同的文本:
<h:panelGroup id="someid" layout="block">
<h:panelGroup id="panelCamposTD" layout="block">
<h:outputText value="#{myBean.flaggedText}"></h:outputText>
</h:panelGroup>
</h:panelGroup>
将getter添加到支持的bean:
public String getFlaggedText(){
if (flag){
return "EDITED";
}else{
return "READ ONLY";
};
}
另一种选择是将两个输出文本放在前端并隐藏其中一个:
<h:panelGroup id="someid" layout="block">
<h:panelGroup id="panelCamposTD" layout="block">
<h:outputText value="EDITED" rendered="#{myBean.flag}"></h:outputText>
<h:outputText value="READ ONLY" rendered="#{not myBean.flag}"></h:outputText>
</h:panelGroup>
</h:panelGroup>