【问题标题】:Dynamically populate options in a selectOneMenu by <ui:repeat>通过 <ui:repeat> 在 selectOneMenu 中动态填充选项
【发布时间】:2019-04-15 10:43:02
【问题描述】:

我正在尝试在 primefaces 中填充一些下拉菜单,其内容取决于 GUI 中其他选项的一些选项。这是我正在尝试做的一个简化示例:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:p="http://primefaces.org/ui" 
      xmlns:c="http://xmlns.jcp.org/jsp/jstl/core" >
    <h:head>
        <title>Test</title>
    </h:head>
    <h:body>
        <h:form>
            <c:set var="options" value="#{['1','2','3']}" />
            <c:set var="currentValue" value="#{3}" />
            <h:outputText value="${options}" />
            <ui:repeat var="r" value="#{options}">
                <h:outputText value="#{r}" />
            </ui:repeat>
            <c:set var="currentValue" value="#{currentValue}" />
            <p:selectOneMenu id="selectValue" 
                             value="${currentValue}" 
                             class="pFieldSet_Template_Input200 r10">
                <p:ajax event="change" />
                <ui:repeat var="r" value="#{options}">
                    <f:selectItem itemLabel="Choice #{r} (20180101)" itemValue="#{r}" />
                </ui:repeat>
            </p:selectOneMenu>
        </h:form>
    </h:body>
</html>

当我访问该页面时,它显示 [1, 2, 3]123 和一个空的 selectOneMenu。我本来希望 selectOneMenu 也包含选项。迭代显然在上述情况下有效,所以我不知道为什么它不显示菜单中的选项。我做错了什么?

【问题讨论】:

  • 为什么不直接使用&lt;f:selectItems value="#{options}" var="r" .../&gt;?
  • 如果你不希望它像@JasperdeVries 建议的那样做,你应该改用c:foreach,但这不太动态。然后阅读stackoverflow.com/questions/3342984/…。使用普通的 jsf 选择也会失败。所以它与 PrimeFaces 无关(总是检查某些通用组件是否也失败)
  • @jasper-de-vries 我不知道你可以这样做。经过一番摆弄后,它就像一个魅力一样工作。谢谢。

标签: user-interface jsf primefaces


【解决方案1】:

&lt;ui:repeat&gt; 是一个 UI 组件,而 &lt;f:selectItem&gt; 是一个标记处理程序(如 JSTL)。 Taghandlers 在视图构建期间运行,在视图渲染期间运行的 UI 组件之前运行。所以在&lt;ui:repeat&gt;运行的那一刻,没有&lt;f:selectItem&gt;的方法。

&lt;c:forEach&gt;,也是一个标签处理程序,可以工作:

<p:selectOneMenu id="selectValue" 
                             value="${currentValue}" 
                             class="pFieldSet_Template_Input200 r10">
                <p:ajax event="change" />
    <c:forEach items="#{options}" var="r">
       <f:selectItem itemLabel="Choice #{r} (20180101)" itemValue="#{r}" />
    </c:forEach>
</p:selectOneMenu>

【讨论】:

  • 让它更清楚为什么它不起作用。谢谢。
  • 许多(如果不是大多数甚至全部)这类问题在 stackoverflow 中有重复的 Q/A。而不是回答他们,通常是指重复。 stackoverflow.com/questions/8152322/…
猜你喜欢
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多