TL; DR 是否有类似于复合的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"
但是,我无法使用自定义标记,因为我不知道能够让我访问id的EL表达式(或其他东西)。我可能要等到页面加载后,然后使用jQuery检查id并在事后设置数据目标,但我希望有一个更纯粹的JSF解决方案。
目前我正在使用JSF 2.1和Bootstrap 2.3。
答案 0 :(得分:0)
答案似乎不是。 BalusC says你应该用“普通”JSF组件替换自定义标签之类的东西。在这种情况下,这意味着使用复合组件。
如果您对使用自定义标记感到不满,我通过使用表单ID中的索引解决了问题(来自answer here的大量帮助):
我将ui:repeat
替换为可以访问该项索引的c:forEach
:
<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
是构建时构造(请参阅详细信息in this answer),如果您需要任何渲染时数据(如果您在preRenderView中构建信息),这是一个问题)。如果您这样做,那么最好将ui:repeat
与自定义组件结合使用,并依赖cc.clientId
。