TL;DR有没有像composite的cc.clientId这样的东西可以给我自定义标记的id?
详细信息:我想要一个自定义标记,它将呈现一个标签、一个值和一个图标。当单击该图标时,应该会打开一个Bootstrap模态来编辑该值。
<ui:composition>
<div> #{field.label}: #{field.value}
<a class="icon-pencil" data-target="#editForm" data-toggle="modal">
</div>
<h:form id="editForm" class="modal hide fade" role="dialog" ...>
... there's an input here linked to field.value ...
</h:form>
</ui:composition>
我可以将标签与<my:editor />
一起使用。当我在ui:repeat中执行此操作时,会在editForm中预先添加一个id,以便使用id j_idt104:editForm
进行渲染。所以我需要修改数据目标以包括id。
使用复合组件会非常容易,因为我可以通过cc.clientId:访问id
data-target="##{cc.clientId}:editForm"
然而,我无法使用自定义标记,因为我不知道有哪个EL表达式(或其他什么(可以让我访问id。我可能会等到页面加载后,再使用jQuery检查id,并在之后设置数据目标,但我希望有一个更纯的JSF解决方案。
目前我使用的是JSF 2.1和Bootstrap 2.3。
答案似乎是否定的。BalusC说你应该用"普通"JSF组件替换自定义标签之类的东西。在这种情况下,这意味着使用复合组件。
如果你对使用自定义标签一筹莫展,我通过在表单的id:中使用索引来解决这个问题(这里的答案提供了很多帮助(
我用一个可以访问物品索引的c:forEach
替换了ui:repeat
:
<table>
<c:forEach items="#{bean.items}" var="item" varStatus="status">
<my:editor index="#{status.index}" ... />
</c:forEach>
</table>
在自定义标签中,我使用了data-target
:中的索引
<tr>
<td>#{label}: #{value}</td>
<td>
<a data-target="#editForm-#{index}" ... ></a>
<h:form id="editForm-#{index}" ... >
...
</h:form>
</td>
</tr>
唯一的问题是c:forEach
是一个构建时构造(请参阅本答案中的详细信息(,如果您需要任何渲染时数据(例如在preRenderView中构建信息(,这将是一个问题。如果这样做,那么最好使用带有自定义组件的ui:repeat
,并依赖cc.clientId
。