【问题标题】:Updating a component with binding (JSF2 + PrimeFaces 5.0.2) [duplicate]使用绑定更新组件(JSF2 + PrimeFaces 5.0.2)[重复]
【发布时间】:2014-08-03 10:33:18
【问题描述】:

我在处理 PrimeFaces 5.0 和具有“绑定”的 panelGroup 时遇到了一些麻烦。我知道,“绑定”很糟糕,但我正在使用一个遗留系统,相信我,如果没有“绑定”,真的很难让它正确。

所以,当我点击mi链接时,“绑定”属性的getter在“动作”之前被调用,然后动作被调用,最后是“更新”。但是,该组件未正确更新。

即使我让它在绑定的 getter 之前运行“动作”,并且 getter 返回正确的东西,这个特定的组件也不会更新。

我有更多没有绑定的组件已正确更新,但不是带有“绑定”的组件。


更新:

这是其余的代码。 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;
   }


}

【问题讨论】:

  • 如果不检查完整代码就无法发表评论,但我仍然认为您还需要更新 tabView 组件。
  • 我已经尝试更新整个表单(包括 tabView),但也没有用。我会尝试专门更新 tabView...
  • 我刚刚用其余代码编辑了我的问题...我只是尝试过这种方式,但对我不起作用。

标签: jsf-2 primefaces binding


【解决方案1】:

您应该避免绑定到具有会话范围的托管 bean。这可能会造成很多麻烦:

JSF 2.0 Spec

3.1.5 组件绑定

[...]

组件绑定通常与通过托管 Bean 创建工具动态实例化的 JavaBean 结合使用(请参阅第 5.8.1 节“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>

【讨论】:

  • 如果您将发现此信息的来源归因于而不是模仿现有答案并像您自己的答案一样行事,我们将不胜感激。另请参阅meta.stackexchange.com/questions/160077/… 或者,如果碰巧是重复的问答,请相应地标记/投票。
猜你喜欢
  • 2015-07-03
  • 2012-08-16
  • 1970-01-01
  • 2016-09-27
  • 2012-07-26
  • 2012-11-12
  • 2016-10-21
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多