当前位置: 首页 > 面试题库 >

如何解决循环命名容器中的组件

沈弘文
2023-03-14
问题内容

我具有以下结构(省略了内容和属性):

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

由于容器内的内容取决于内部列表按钮的操作,因此我需要对其进行更新。当没有external时,上述方法有效ui:repeat。但是,如果有一个,它将失败并显示component not found错误。

这似乎是由于cc.clientIdthen本身包含外部的行索引ui:repeat,例如outerlist:0:myCC:container。至于这个答案评论指出,这个索引ID是不是在视图树的服务器端表示可用。而是“行索引仅存在于客户端”。我必须承认,我不太了解此索引的完成方式以及服务器端可用的内容。

所以我的问题是:JSF如何执行此索引,它如何(在服务器上)分隔a内的不同“实例” ui:repeat,是否有解决上述代码的方法?


问题答案:

在指定的客户端ID <f:ajax>必须是可用 两个 由JSF的服务器端

facesContext.getViewRoot().findComponent(clientId);

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

在客户端通过JavaScript的

document.getElementById(clientId);

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

由于<ui:repeat>仅在视图渲染期间运行,因此具有行索引的客户端ID在服务器端不表示有效的组件(错误消息来自“无法找到组件…”
findComponent(),但在客户端中却表示有效的HTML元素
。基本上,您将需要客户端ID,而服务器端没有行索引,客户端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}" />

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



 类似资料:
  • 问题内容: 我想知道Python中是否存在这样的循环命名系统。我曾多次遇到过确实需要从内循环跳出外循环的情况。通常,我通过将内部循环放在一个函数中解决此问题,该函数返回(其中包括)一个布尔值,该布尔值用作中断条件。但是标记中断的循环似乎要简单得多,如果python中存在这样的功能,我想尝试一下 有人知道吗? 问题答案: 有人建议在python PEP3136中包含命名循环,但是在此不作解释。拒绝的

  • 问题内容: 我正在将Java项目从Ant迁移到Gradle。我认为最好的解决方案是使用Gradle的多项目支持,但是我找不到摆脱循环依赖的方法。 原始项目已设置为具有以下布局: 之间的关系,并且,是棘手的。将取决于或根据配置文件。同样,无论配置属性如何,都依赖和。并且永远不会在同一时间建造。 我认为一种快速的解决方案是在: 接下来,我想过要找到一种方法来使之更接近公正工作。这导致我想到了这一点:

  • 本文向大家介绍深拷贝里的循环引用如何解决?相关面试题,主要包含被问及深拷贝里的循环引用如何解决?时的应答技巧和注意事项,需要的朋友参考一下 考察的是如何实现深拷贝问题。深拷贝需要为每一个对象属性创建新的对象,但是如果单纯这样做碰到含有循环引用的对象,就会进入死循环。 这么操作当然是错误的,为了正确进行深拷贝,不出现这种错误,就需要: 遍历原对象每个节点的时候,记录该节点是否被访问过,这样当在遍历过

  • 本文向大家介绍iOS如何巧妙解决NSTimer的循环引用详解,包括了iOS如何巧妙解决NSTimer的循环引用详解的使用技巧和注意事项,需要的朋友参考一下 一 发现问题 我们都知道NSTimer采用target-action的方式,通常target又是类本身,我们为了方便又把NSTimer声明为属性变量,这样就难免会造成循环引用(需要反复执行计时任务时,如果是单次的任务就不会造成循环引用)。 例如

  • 本文向大家介绍vue 解决循环引用组件报错的问题,包括了vue 解决循环引用组件报错的问题的使用技巧和注意事项,需要的朋友参考一下 做项目时遇到使用循环组件,因为模式一样,只有数据不一样。但是按照普通的组件调用格式来做时报错,错误信息为Unknown custom element: <pop> - did you register the component correctly? For recu

  • 上面是滑动 css 代码区域时出现的效果,打算是为了完整看到代码的,但是结果触发了外部的滑动。 容器使用 swiper 组件实现滑动效果,一般开发中,如果 swiper 组件内嵌 scroll-view 组件,如果 scroll-view 组件可以滚动,那么 scroll-view 组件会优先进行滚动,不会出现这样的问题。但是这里使用的是 rich-text 富文本组件来渲染内容,富文本内无法使用