为什么我为p:tab子项获得相同的ID后缀?

时间:2013-08-16 11:01:18

标签: jsf primefaces

我在Mojarra中使用Primefaces,并注意到每个动态p:tab下的树都有相同的id

<p:tabView id="customerData" value="#{documentTabView.documentTabs}" var="tab" dynamic="true">  
   <p:tab title="#{tab.title}" closable="#{tab.closable}" >
      <p:panel>
         <h:outputText value="test_#{tab.title}"/>
      </p:panel>
  </p:tab>
</p:tabView>

结果HTML如下:

<div id="customerData" class="ui-tabs ui-widget ui-widget-content ui-corner-all ui-hidden-container ui-tabs-top">
   <ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" role="tablist">
      <li class="ui-state-default ui-tabs-selected ui-state-active ui-corner-top" role="tab" aria-expanded="true"><a href="#customerData:0:j_idt21">all documents</a></li>
      <li class="ui-state-default ui-corner-top" role="tab" aria-expanded="false"><a href="#customerData:1:j_idt21">other documents</a><span class="ui-icon ui-icon-close"></span></li>
   </ul>
   <div class="ui-tabs-panels">
      <div id="customerData:0:j_idt21" class="ui-tabs-panel ui-widget-content ui-corner-bottom" role="tabpanel" aria-hidden="false">
         <div id="customerData:0:j_idt46" class="ui-panel ui-widget ui-widget-content ui-corner-all">
            <div id="customerData:0:j_idt46_content" class="ui-panel-content ui-widget-content">test_all documents</div>
         </div>
         <script id="customerData:0:j_idt46_s" type="text/javascript">PrimeFaces.cw('Panel','widget_customerData_0_j_idt46',{id:'customerData:0:j_idt46'});</script>
      </div>
      <div id="customerData:1:j_idt21" class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-helper-hidden" role="tabpanel" aria-hidden="true"></div>
   </div>
   <input type="hidden" id="customerData_activeIndex" name="customerData_activeIndex" value="0" autocomplete="off" />
</div>

您能解释一下为什么同一个id(这里j_idt21)被使用了两次。我知道它以tab索引为前缀,但我想知道它是否存在强制拥有另一个(和不同的)id的解决方案。

1 个答案:

答案 0 :(得分:3)

因为只有一个 <p:tab>组件,它会多次生成相同的HTML片段,具体取决于<p:tabView value>的当前迭代轮次。

如果您对自动生成的ID感到困扰,只需给<p:tab>一个固定ID。

<p:tab id="tab" ...>

如果您担心按固定ID区分标签,例如JavaScript,然后将其内容放在纯<div>内,其id是根据当前迭代的项生成的。 E.g。

<p:tab ...>
    <div id="#{tab.name}">
        ...
    </div>
</p:tab>