访问JSF Custom Tag的id

时间:2014-04-29 18:42:08

标签: jsf jsf-2 twitter-bootstrap-2

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。

1 个答案:

答案 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