Jsf 2 参考JSF基于迭代索引动态生成的ids

Jsf 2 参考JSF基于迭代索引动态生成的ids,jsf-2,Jsf 2,在JSF中,和类似的组件,如PrimeFaces根据迭代索引为子组件生成动态ID,即: <p:dataTable id="table" var="item" value="#{itemList}"> <h:outputText id="name" value="#{item.name}"/> </p:dataTable> 将生成如下内容: <table id="table"> <span id="table:0:name

在JSF中,
和类似的组件,如PrimeFaces
根据迭代索引为子组件生成动态ID,即:

<p:dataTable id="table" var="item" value="#{itemList}">
    <h:outputText id="name" value="#{item.name}"/>
</p:dataTable>

将生成如下内容:

<table id="table">
    <span id="table:0:name">name0</span>
    <span id="table:1:name">name1</span>
    <span id="table:2:name">name2</span>
    ...
    <span id="table:n:name">nameN</span>
</table>

名称0
名称1
姓名2
...
纳明
因此,所有元素显然都有一个不同的客户端id。我故意跳过了
等等

因此,
引用了表中的所有名称,它工作正常,
失败,出现类似于
严重:javax.faces.FacesException:找不到视图中标识符为“:table:0:name”的组件。
事件,尽管我可以确认标记中存在该组件。不可能这样做吗


我在GlassFish 3.1.2和Mojarra 2.1.6上运行,以防相关。

它确实不存在于JSF组件树中,因为它是可由用户遍历的。它只存在于生成的HTML输出中。JSF组件树中只有一个
,而不是您所期望的多个。它只是在生成HTML输出时被多次重用。充其量,您可以通过
table:name
获取物理组件,但这反过来又不存在于HTML DOM树中,因此
document.getElementById()
在执行ajax更新时会失败

无论如何,为了实现具体的功能需求,您基本上需要有一个物理现有组件来表示JSF组件树中的行。如果使用视图生成时间标记(如JSTL
)而不是视图渲染时间标记,则可以在循环中创建它们

<table id="table">
    <c:forEach items="#{itemList}" var="item" varStatus="loop">
        <tr><td><h:outputText id="table_#{loop.index}_name" value="#{item.name}" /></td></tr>
    </c:forEach>
</table>

这将在JSF组件树中创建多个物理组件,并呈现为:

<table id="table">
    <span id="table_0_name">name0</span>
    <span id="table_1_name">name1</span>
    <span id="table_2_name">name2</span>
    ...
    <span id="table_n_name">nameN</span>
</table>

名称0
名称1
姓名2
...
纳明
您可以通过例如
update=“:table#{someDesiredIndex}\u name”
引用它们

另见:


更新:自Mojarra 2.2.5以来,
不再验证客户端ID,渲染器能够遍历迭代组件以找到正确的迭代轮进行渲染。因此,以这种方式引用
中的迭代索引应该可以正常工作。它仅在当前的MyFaces 2.2.7/PrimeFaces 5.1版本中不起作用,但预计它们将在未来的版本中迎头赶上。

谢谢!我有点怀疑情况会是这样。如果我可以不用它,你不会推荐这种变通方法吧?视图可能会变得太大,我正在使用ADF10G(JSF1.1),而这个解决方案对我来说并不适用。我不知道我是做错了什么,还是与JSF1.1有关。有什么想法吗?我指的是使用id=“table_35;{loop.index}”之类的表达式动态生成id组件,谢谢@BalusC!当你说遗留JSP时,你的意思是我正在使用一个旧的JSF实现版本,不是吗?@Eduardo:自从JSF2.0以来,JSP作为视图技术被弃用,并被Facelets(XHTML)成功/取代。Facelets也可通过手动安装/重新配置的方式用于JSF1.2,但不适用于1.1或更早版本。