在JSF中, <ui:repeat/>和类似的组件(如PrimeFaces <p:dataTable/>基于迭代索引为子组件生成动态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>

所以所有元素显然都有明确的客户ID。 我故意跳过<tr/><td/>等。

所以, <p:ajax ... update=":table:name"/>引用表中的所有名称,它工作正常, <p:ajax ... update=":table:#{someDesiredIndex}:name"/>失败并显示类似于SEVERE: javax.faces.FacesException: Cannot find component with identifier ":table:0:name" in view.的消息SEVERE: javax.faces.FacesException: Cannot find component with identifier ":table:0:name" in view. 虽然我可以确认该组件存在于标记中。 是不是可以这样做?

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

===============>>#1 票数:13 已采纳

它确实不存在于JSF组件树中,因为UIViewRoot#findComponent()可以遍历它。 它仅存在于生成的HTML输出中。 JSF组件树中只有一个<h:outputText id="name"> ,而不是你想象中的多个。 在生成HTML输出时,它被重复使用了多次。 最好的情况是,您可以通过table:name获取物理组件,但这反过来又不存在于HTML DOM树中,因此在执行ajax更新期间, document.getElementById()将失败。

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

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

您可以通过例如update=":table_#{someDesiredIndex}_name"来引用它们。

也可以看看:


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

  ask by rdcrng translate from so

未解决问题?本站智能推荐:

1回复

找不到JSF 2动态生成的ID

我在render参数中的f:ajax标记中动态生成ID时遇到问题。 我得到错误: 码: 知道如何解决这个问题吗?
2回复

在JSF中生成自己的会话ID

我有一个使用JSF框架的Web应用程序。 我一直在深入研究Web应用程序的安全性部分,因此我希望生成自己的唯一会话ID(使用加密算法并将其分配给用户登录后创建的每个新会话。 谁能指导我如何在会话中设置手动生成的会话ID,并确保每次请求都传输会话ID。 谢谢。
1回复

JSF中复合组件的动态ID

我在我的复合JSF组件中创建了一个链接: 该链接不在表单中。 但是,当我查看呈现的HTML代码时,会有一个动态生成的ID作为我的id的前缀: 我无法找到这个动态ID的来源。 有任何想法吗? ps:我们将分隔符更改为:to _
1回复

如何在javascript中访问jsf动态ID(jsf 2.0版)

我需要在javascript中访问componets动态ID,我也在互联网上尝试了很多方法,但似乎无法正常工作。 我尝试过这种方式.. 这样您就可以通过UIComponent#getClientId()在视图中的其他位置打印其客户端ID。 } 在这里,我将input1
1回复

JSF2.0复合组件ID生成

我正在使用Weblogic 11g上的JSF2.0创建新的Web应用程序。 我正在使用JSF Ajax进行表单提交。 我对JSF还是很陌生,所以仍然要学习绳索。 主页上的jQuery选项卡上有3种形式。 原始代码有很多重复的输入字段,例如userName和password等(id前面加有
1回复

如何呈现其ID是在JSF中自动生成的元素?

我有放置在primefaces tabView上的primefaces'datatable。 我正在对其进行过滤。 随着网格中新值的更新,我想重新渲染过滤器。 筛选器ID生成为:tabViewId:ActiveTabIndex:DatatableID:ColumnName_filt
1回复

jsf ui的动态ID问题:重复

我有一个问题,希望您能对我有所帮助。 我正在使用jsf和mojarra。 我以此创建一个inputtext矩阵。 为每个输入文本呈现这样的内容 基本上,我需要限制值,因此始终只显示一个小数,这就是为什么我进行ajax调用来呈现自己(通过mojarra.ab方法)并且在inpu
1回复

如何在EL(jsf,composite)中使用生成的ID?

我想要一个合成的 当我写 该代码的原始目的是将修改器状态(Ctrl,Shift,Alt)发送到服务器。 我有 完全可以预期,这是行不通的。 令人讨厌的表达是 它旨在返回id为k_imgA的hiddenInput的clientId。 据我所知,EL无法像上
1回复

在JSF页面内显示动态生成的图像

我有一个JSF页面,该页面需要显示位于Web文件夹中的动态生成的图像(使用jfreeChart)。 加载页面后,它将显示先前生成的图像,而不是新图像。 我的图像渲染方法(在页面加载时调用); 控制器类具有创建图像的方法,并且在加载页面时都将调用这两个方法。 问题是,在执行cr
1回复

JSF:如何与动态生成的html内容绑定?

我的jsf页面上有一个带有selectonemenus的字段集。 我在单击链接时使用jquery克隆了字段集 ,类似于“添加另一行”(逻辑类似于: 使用jQuery根据下拉框值动态添加表单字段(或字段集) ),现在可以添加无限个字段集如何在控制器上绑定或获取此动态生成的表单内容的值。 我使用