【问题标题】:JSF 2.0 How to display a different h:panelGroup each time an item is selected from a selectOneMenuJSF 2.0每次从selectOneMenu中选择一个项目时如何显示不同的h:panelGroup
【发布时间】:2011-06-26 01:07:08
【问题描述】:

我有一个 selectOneMenu 显示一些不同的东西类别:

<h:selectOneMenu value="#{searchController.selectedCategory}">
        <f:selectItems value="#{searchController.formatedCategories()}" >               
        </f:selectItems>
    </h:selectOneMenu>

我需要根据所选类别显示不同的 panelGroup。 示例(这个需要显示,当第一个项目被选中时)

<h:panelGroup id="carInfo">
        <h:outputText value="marka" />
        <h:selectOneMenu>
            <f:selectItems value="#{searchController.formatedCarMarks()}" />
        </h:selectOneMenu>
        <h:outputText value="godina" />
        <h:selectOneMenu>
            <f:selectItems value="#{searchController.formatedYearFrom()}" />
        </h:selectOneMenu>
        <h:selectOneMenu>
            <f:selectItems value="#{searchController.formatedYearTo()}" />
        </h:selectOneMenu>
        <h:outputText value="kms.:" />
        <h:selectOneMenu>
            <f:selectItems value="#{searchController.kmsFrom()}" />
        </h:selectOneMenu>
        <h:selectOneMenu>
            <f:selectItems value="#{searchController.kmsTo()}" />
        </h:selectOneMenu>
    </h:panelGroup>

我不知道该怎么做,因为我需要在不刷新页面的情况下这样做。 有任何想法吗? Ajax 可以在这里帮助我吗?如果是这样,有人可以告诉我怎么做吗?我一点也不熟悉。

【问题讨论】:

    标签: java ajax jsf jsf-2 java-ee-6


    【解决方案1】:

    sourceId=null[severity=(ERROR 2), summary=(一个或多个资源的目标是'head',但视图中没有定义'head'组件。), detail=(一个或多个资源的目标是“头”,但视图中没有定义“头”组件。)]

    检查你的 head 标签,你可能错过了 h 前缀,写 h:head,我通过使用前缀 h 解决了问题。

    【讨论】:

      【解决方案2】:

      我非常接近解决方案,但出了点问题。我已经按照你说的做了每一件事:第一个和第二个问题都解决了。问题是当我选择类别时面板 carInfo 没有被渲染。

      托管 bean 中的方法有问题吗? 由于某种原因,它没有被调用。 这就是我的代码目前的样子 托管豆

       public void carSelectedEvent(ValueChangeEvent e) {
          String tmp = (String) e.getNewValue();
          System.out.println("CALLED!!!!!");
          if (selectedCategory.trim().equals("automobili")) {
              carCategorySelected = true;
          } else if (e.getNewValue().toString().contains("NEKRETNINE")) {
      
          }
      }
      

      JSF页面选择

      <h:selectOneMenu value="searchController.selectedCategory">
              <f:selectItems value="#{searchController.formatedCategories()}" ></f:selectItems>
              <f:ajax event="change" action="searchController.carSelectedEvent" render="carInfo"/>
          </h:selectOneMenu>
      

      需要显示的JSF面板

      <h:panelGroup id="carInfo" rendered="searchController.carCategorySelected">
      ...
      

      当我导航到该页面时,一切似乎都正常,但我在控制台中注意到此消息:

      信息:警告:FacesMessage(s) 已入队,但可能没有 被显示。 sourceId=null[severity=(ERROR 2), summary=(一个或多个 资源的目标是“头”,但没有“头”组件 在视图中定义。),detail=(一个或多个资源具有 'head' 的目标,但在 查看。)]

      【讨论】:

      • 第一个问题-如果页面未刷新,我真的不知道如何获取代表所选值的字符串答案-创建一个新的字符串变量并在 selectOneMenu 任务中使用第二个-一直显示两个面板... 答案 - 不要使用 而是在 panelGroup Quest 3rd 中使用 render="bean.booleanField" - 我实际上应该做什么...在面板中?答案 - 检查新创建的字符串变量的值并做出相应的决定。此外,您可以像使用 JSF2.0 一样使用
      • 您不应将问题发布为答案。编辑您的问题以更新它,或者如果它涉及不同的具体问题,则发布一个新问题。另请参阅stackoverflow.com/faq
      • 好的,我会记住这一点,我不会发布问题作为答案。这是我在论坛的第一天,对此感到抱歉。
      【解决方案3】:

      您说“不刷新页面”在这种情况下有两种方法可以实现:
      1. AJAX:您必须在您的 selectOneMenu
      上附加 cartInfo id 和 onChange 事件,这将重新渲染 cartInfo 面板组
      示例:

      <h:selectOneMenu value="#{searchController.selectedCategory}">
              <f:selectItems value="#{searchController.formatedCategories()}" >               
              </f:selectItems>
            <f:ajax event="change" execute="@this" render="cartInfo"/>
          </h:selectOneMenu>
      

      注意:您必须在 panelGroup 中有一些属性才能在更改事件时评估为 true。

      2。 JavaScript:您可以将面板放在 div 中,并且可以在 onChange 事件中再次显示/隐藏 div。
      示例:

      <h:selectOneMenu value="#{searchController.selectedCategory}" onChnage="javascript: showDivFunction()">
      

      ...

      <div id="divCartInfo" style="display:none">
      <h:panelGroup id="carInfo">
      .....
      </div>
      

      【讨论】:

      • OP使用的是JSF2,不一定需要Ajax4jsf。
      • @BC 感谢您强调这一点。更新了我的答案:-)
      • 我终于成功了 :) 在面板中: ...非常感谢你们!!
      【解决方案4】:

      这可以通过 ajax 轻松完成:

      • &lt;h:panelGroup&gt; 元素放入外部&lt;h:panelGroup&gt;
      • &lt;h:selectOneMenu&gt; 内嵌套一个&lt;f:ajax&gt;,并将外部&lt;h:panelGroup&gt; 的ID 放在其render 属性中。
      • 为每个内部 &lt;h:panelGroup&gt; 元素提供一个 rendered 属性,该属性仅在选择了相应类别时才计算为 true。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-29
        • 1970-01-01
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-22
        相关资源
        最近更新 更多