【问题标题】:How to pass the selected values from selectcheckBoxMenu to my bean?如何将 selectcheckBoxMenu 中的选定值传递给我的 bean?
【发布时间】:2019-07-02 03:41:01
【问题描述】:

我正在使用 JSF 2.2.8 和 primefaces 6.0,并且我有一个 selectCheckBoxMenu 我想在我的 bean 中检索选定的值。

selectCheckboxMenu 是从数据库中填充的,但是当我选择属性并保存时没有任何反应,它不会调用保存函数

这是我的 selectCheckBoxMenu

                          <p:outputLabel for="ressource" value="Ressource"/>
                        <h:panelGroup >         
                         <p:selectCheckboxMenu id="ressource" label="Ressource" value="#{affectationBean.selectedRessource}"  multiple="true">
                                <f:selectItems value="#{affectationBean.ressources}" var="r" itemLabel="#{r.nom}" itemValue="r.idt_ressource" />
                            </p:selectCheckboxMenu>
                         </h:panelGroup>
                        <p:commandButton icon="ui-icon-save"  actionListener="#{affectationBean.save}" value="Save" update="@affectation" ajax="false" style="display:inline-block;margin-top:5px"/>

这里是selectedRessource和actionListener save的声明

    private Long [] selectedRessource;
    // Getters setters and Construct


    public void save(){

    for(int i=0 ;i<selectedRessource.length;i++){
    system.out.println("id ===> " + selectedRessource[i]);
    } 

【问题讨论】:

标签: jsf primefaces selectcheckboxmenu


【解决方案1】:

我的建议是: 首先确保所有内容都在 h:form 标签内。 不需要多个 = true 因为这个标签没有这个属性 我通过以下修改进行了测试,并在我的 bean 中获得了选定的多个值。唯一的区别是我对 itemLabel 和 itemValue 使用相同的值,但在你的情况下它是对象。我也在使用 primefaces 6,甚至不需要将 actionListner 更改为 action。它按原样工作。sample xhtml sample ResourceBean.java

                                  <p:outputLabel for="ressource" value="Ressource"/>
                    <h:panelGroup >         
                     <p:selectCheckboxMenu id="ressource" label="Ressource" value="#{resourceBean.selectedRessource}">
                            <f:selectItems value="#{resourceBean.ressources}" var="r" itemLabel="#{r}" itemValue="#{r}" />
                        </p:selectCheckboxMenu>
                     </h:panelGroup>
                    <p:commandButton icon="ui-icon-save"  actionListener="#{resourceBean.save}" value="Save" ajax="false" style="display:inline-block;margin-top:5px"/>

【讨论】:

    【解决方案2】:

    问题出在你的p:commandButton,你有3个选项

    改变你的方法:

    public void save(ActionEvent actionEvent){...}
    

    改变你的动作监听器值:

    actionListener="#{affectationBean.save()}"
    

    或更改您的按钮以使用action

    action="#{affectationBean.save}"
    

    【讨论】:

      【解决方案3】:

      免责声明:这是一种解决方法。它不是一个永久的解决方案,但允许您使用 selectCheckboxMenu 并继续工作。

      此组件存在问题,阻止它在提交时将值传递给支持 bean。

      由于某种原因,应该包含所选值的数组在提交时会被清除。因此,我制作了一个未在标签中声明的额外数组,并在每个更改事件中更新。然后在提交时值仍然存在。见下文:

      BackingBean.java

      private String[] sCodes;
      private String[] sCodes2; //extra array, not in form.xhtml
      
      public void updateCodes()
          {       
              sCodes2 = sCodes; //keeps the values in the other array
          }
      
      public void doSend() throws IOException
          {
      log.trace("selected codes: {} selected codes2 length: {}", sCodes.length, sCodes2.length);
          }
      

      form.xhtml

      <p:selectCheckboxMenu id="codeCtl" value="#{bean.SCodes}" label="Codes" filter="true" filterMatchMode="startsWith" panelStyle="width:250px">
      <f:selectItems value="#{bean.menuCodes}" />
      <p:ajax event="change" listener="#{bean.updateCodes()}" />                                        
      </p:selectCheckboxMenu>
      <p:commandButton value="submit" actionListener="#{bean.doSend}" id="ctlSubmit" update="appform"/>
      

      【讨论】:

      • 这是一个奇怪的解决方案,很可能是范围“问题”的解决方法
      • 我已经研究并测试了该解决方案,这是一种解决问题的解决方法,并允许在开发人员解决问题之前使用 selectCheckboxMenu。我不认为你对 Kukeltje 投反对票是合理的。
      • 您没有说过这是一种解决方法,而不是真正的解决方案。如果您说这只是一种解决方法,因为真正的原因尚不清楚,我不会投反对票。我这样做的原因是我认为没有人应该将其用作解决方案。令我感到奇怪的是,您说“直到开发人员解决问题”...如果您通过编码来解决问题,我认为您是开发人员...
      • 我是我雇主的开发人员,但不是 PF 项目的开发人员。对于 PF,我是用户,但我仍然通过测试他们的代码(通过使用它)并指出问题来提供价值。我本可以简单地使用我的解决方法而不花时间输入它,但我认为这样做会有所帮助。我已经编辑了我的问题,希望你能删除你的反对票 Kukeltje。
      • 但不清楚您要解决的问题是什么。 PrimeFaces 代码中没有任何内容需要在这方面进行修复(我不知道 github 中的票证,您也没有提供票证)。如果您没有提供一个真正完整的 minimal reproducible example 作为失败的示例,也没有提供版本信息(原始问题是关于 6.0,此后已被 6.1、6.2 和 7.0 取代),很难相信这是一个PrimeFaces 中的错误,因为它是非常基本的功能。我个人仍然认为您的代码中存在范围界定问题,该问题会创建您为其创建此解决方法的特定行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多