Omnifaces TagAttribute Id不能用作Id



我有以下Facelet Taglib:

<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:o="http://omnifaces.org/ui"
xmlns:h="http://java.sun.com/jsf/html">
<o:tagAttribute name="id"/>
<h:panelGroup id="#{id}" layout="block" styleClass="idTest">
#{id}
</h:panelGroup>
</ui:composition>

taglib.xml看起来像这样:

<tag>
<tag-name>idTest</tag-name>
<source>resources/myProject/tags/idTest.xhtml</source>
</tag>

使用它的代码是:

<myProject:idTest/>

怎么可能,下面的HTML正在被呈现:

<div class="idTest">
j_ido489794984_4bf870cd
</div>

为什么我的PanelGroup没有id?id是根据o:tagAttribute的文档生成的,因为div的内容是呈现的。但作为id,它不起作用。为什么?

这确实令人困惑。

文档的字面意思是:

…它将自动生成一个j_ido[tagId]形式的唯一ID,其中[tagId]<o:tagAttribute>标签自己的唯一ID。

但实际的行为更像这样:

…它将覆盖任何自动生成的ID为j_ido[tagId]的形式,其中[tagId]<o:tagAttribute>标签自己的唯一ID。

换句话说,当JSF本身需要时要呈现HTML元素的id属性,通常是因为链中的一些内部逻辑需要它,例如<f:ajax>和friends,并且没有像<x:someTag id="fixedId" />那样在标记上指定显式ID,那么JSF将默认自动生成j_id[autoIncrementInteger]形式的ID。但是这将在标记文件上出错,因为autoIncrementInteger可能会在每次回发时被进一步推迟一个,这取决于所使用的JSF impl和视图状态配置。<o:tagAttribute>只是试图以这种方式确保自动生成的ID在每次回发时保持相同。

当您编辑测试标记文件以添加<f:ajax>时,

<h:panelGroup id="#{id}" layout="block" styleClass="idTest">
<f:ajax event="click" />
</h:panelGroup>

,那么您将看到生成的<div>有一个id,因为这在技术上是<f:ajax>所需要的。

<div id="j_ido-1512689859_13a7e7e3" class="idTest"
onclick="mojarra.ab(this,event,'click',0,0)">
</div>

或者当你将<h:panelGroup>替换为<h:form>或任何在客户端总是需要ID的组件时,

<h:form id="#{id}" styleClass="idTest">
<ui:insert />
</h:form>

那么你也会看到它已经生成了

<form id="j_ido-1512689859_13a7e7e3" name="j_ido-1512689859_13a7e7e3" method="post" action="/test.xhtml" class="idTest" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_ido-1512689859_13a7e7e3" value="j_ido-1512689859_13a7e7e3" />
...
</form>

换句话说,该特性工作得很好,但是在您的特定情况下没有使用它,因为JSF认为没有必要生成它。

与此同时,我已经更新了文档。

相关内容

  • 没有找到相关文章

最新更新