1

我在支持 bean 中有一个 HashMap,我想动态呈现多个选择框。这是代码:

    <h:selectManyCheckbox
      id="id"
      value="#{backingBean.value}"
      layout="pageDirection"
      styleClass="label"
      required="true"
      requiredMessage="You must select at least...">


      <a4j:repeat var="aGroup" items="#{backingBean.map}">

        <f:selectItem id="role#{aGroup.value.property1}" itemLabel="#{aGroup.value.property1}" itemValue="#{aGroup.value.property2}" />

        <rich:tooltip for="role" value="#{aGroup.value.property5}" />

     </a4j:repeat>

    </h:selectManyCheckbox> 

它不是渲染。使用 f:selectItems 标记,它正在呈现,但我需要手动创建 f:selecteItem,因为我必须为每个 f:selectItem 附加一个rich:tooltip。

有任何想法吗 ?

拉维

4

2 回答 2

1

您不能在<f:selectItem>.

标准 JSF 或 RichFaces 库中也没有任何内容允许在复选框组的标签上自由标记。与 一起使用时,只有Tomahawk<t:selectManyCheckbox>支持它。PrimeFaces的. _layout="spread"<t:checkbox><p:selectManyCheckbox>

这是一个启动示例,您如何使用 Tomahawk 实现它:

<!-- Below displays nothing due to layout="spread". -->
<t:selectManyCheckbox id="foo" value="#{bean.selectedItems}" layout="spread">
    <f:selectItems value="#{bean.availableItems}" />
</t:selectManyCheckbox>

<!-- Below displays the concrete checkboxes with labels. -->
<c:forEach items="#{bean.availableItems}" var="item" varStatus="loop">
    <t:checkbox for="foo" index="#{loop.index}" />
    <h:outputLabel id="label#{loop.index}" value="#{item.label}" />
    <rich:tooltip for="label#{loop.index}" value="#{item.tooltip}" />
</c:forEach>
于 2012-12-18T11:49:46.973 回答
0

使用<c:forEach>而不是<a4j:repeat>.

首先在页面顶部添加此命名空间。

xmlns:c="http://java.sun.com/jstl/core"

现在<a4j:repeat.....用这个代替。

<c:forEach var="aGroup" items="#{backingBean.map}">

编辑:


我认为这<rich:toolTip>不适用于<f:selectItem>. 作为一个奇怪的黑客,你可以做这样的事情。

这是你managed-bean返回的listor map。在这里,我使用的是地图,因为您似乎正在使用地图。

public class MyBean {
  private Map<Integer, String> map;

  public Map<Integer, String> getMap() {
    map = new HashMap<Integer, String>();
    map.put(1, "Tool tip 1");
    map.put(2, "Tool tip 2");
    map.put(3, "Tool tip 3");
    return map;
  }
}

现在您的xhtml代码将是这样的。在这里,我正在selectItem动态渲染 s。但是,这不是必须的。

<h:form id="myForm">
    <h:selectManyCheckbox id="myChkBox" layout="pageDirection" styleClass="label" required="true" requiredMessage="You must select at least...">
        <c:forEach var="aGroup" items="#{myBean.map}">
            <f:selectItem itemValue="someValue1" itemLabel="someValue1" id="someId#{aGroup.key}" /> 
            <span class="rich-tool-tip" id="span#{aGroup.key}" style="z-index: 99; visibility: visible; display: none;">
                <span>#{aGroup.value}</span>
            </span>
            <script>
                var i = !i ? 0 : i;
                new ToolTip("span#{aGroup.key}","myForm:myChkBox:" + i,{'showEvent':'mouseover'} );
                i++;
            </script>
        </c:forEach>
    </h:selectManyCheckbox>
    <rich:toolTip rendered="false"/>
</h:form>

就是这样...
注意<rich:toolTip>设置为rendered="false". 这是必需的。否则一些重要的JS部分没有导入,你toolTip将无法工作。

于 2012-12-18T05:28:28.817 回答