ajax – 如何处理循环命名容器中的组件

前端之家收集整理的这篇文章主要介绍了ajax – 如何处理循环命名容器中的组件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下结构(内容属性省略):
<ui:repeat id="outerlist">
    <my:compositeComponent id="myCC">
        <h:panelgroup id="container">
            Some content here (outputText,etc.)
            <ui:repeat id="innerlist">
               <h:commandButton>
                   <f:ajax render=":#{cc.clientId}:container" />

<!-- all closing tags accordingly -->

由于容器内的内容取决于内部列表按钮的操作,我需要更新它.当没有外部ui:重复时,如上所示的方法起作用.但是,如果存在组件未找到错误,则会失败.

这似乎是因为cc.clientId本身包含外部ui:repeat的行索引,例如,outerlist:0:myCC:容器.如a comment to this answer所示,该索引ID在视图树的服务器端表示中不可用.而是“行索引仅存在于客户端”.我必须承认,我不太明白这个索引是如何完成的以及服务器端的可用内容.

所以我的问题是:JSF如何进行这种索引,它(在服务器上)如何将ui内部的不同“实例”分开:重复,是否有解决方案,我想用上面的代码实现什么?

< f:ajax>中指定的客户端ID必须在JSF的服务器端都可用
facesContext.getViewRoot().findComponent(clientId);

(因此可以找到它以便为ajax响应呈现其新的HTML表示)

并在JavaScript的客户端

document.getElementById(clientId);

(一旦新的HTML内容的ajax响应到达,它就可以被JS更新/替换)

作为< ui:repeat>仅在视图呈现时间内运行,具有行索引的客户机ID不代表服务器端的有效组件(来自findComponent()的“无法找到组件…”错误),但它确实表示客户端中的有效HTML元素侧.基本上,您需要客户端ID,而不需要服务器端的行索引和客户端的行索引.但这不适用于< ui:repeat>因为它(不幸的是)不可能通过单独的findComponent()来选择特定迭代轮次的组件树状态.

使用JSTL< c:forEach>时它应该可以正常工作并且在视图构建期间运行时动态分配组件ID,并且实际上在视图树中生成多个值得满足的JSF组件,而不是仅在渲染期间多次重复使用的组件.

<c:forEach varStatus="loop">
    <my:compositeComponent id="myCC">
        <h:panelGroup id="container_#{loop.index}">
            Some content here (outputText,etc.)
            <ui:repeat id="innerlist_#{loop.index}">
               <h:commandButton>
                   <f:ajax render=":#{cc.clientId}:container_#{loop.index}" />

然而,这有其自身的含义,当然与复合组件一起使用时,以及在嵌套循环中使用时也是如此.您的代码不够完整,无法提供有关该代码的见解和建议.例如,当将这段代码放置在复合组件中时,它会断开,复合组件本身也在渲染时循环中重复使用多次.

也可以看看:

> JSTL in JSF2 Facelets… makes sense?
> How to find out client ID of component for ajax update/render? Cannot find component with expression “foo” referenced from “bar”

猜你在找的Ajax相关文章