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

通过Ajax渲染复合组件

弘承业
2023-03-14
问题内容

我建立了一个复合组件,看起来像这样:

<composite:interface>
  <composite:attribute name="id" required="false" />
  <composite:attribute name="label" required="true" />
</composite:interface>

<composite:implementation>
  <h:panelGroup id="#{cc.attrs.id}">
    <fieldset class="fieldset"><legend>${cc.attrs.label}</legend></fieldset>
  </h:panelGroup>  
</composite:implementation>

组件正确显示当前标签。

<xyz:comp id="idMyComponent" label="#{someBean.text}"/>

...
<a4j:ajax ... render="idMyComponent" />
...

现在,当执行该动作时,什么也不会发生。但是,当我将Postfix添加到组件中的ID时,它可以正常工作(请参见下文)。

...
<composite:implementation>
      <h:panelGroup id="#{cc.attrs.id}Label">
...

并使用后缀在render中定义ID:

<xyz:comp id="idMyComponent" label="#{someBean.text}"/>

...
<a4j:ajax ... render="idMyComponentLabel" />
...

有人可以向我解释为什么仅当我在ID中添加后缀时才起作用h:panelGroup吗?


问题答案:

这个问题实际上有两个方面。

第一个问题是,<xyz:comp id>实际上指定复合部件的ID 本身
<cc:implementation>。默认情况下,HTML输出中不显示该位置,因此ajax /
JavaScript不能被document.getElementById()and friends 找到。

实际上,<h:panelGroup id="#{cc.attrs.id}">最终您会生成如下所示的HTML输出(右键单击页面和“ 查看源代码”
以自己 查看 ):

<span id="idMyComponent:idMyComponent">

第二个“问题”是RichFaces / Ajax4jsf
:不仅通过在当前上下文中进行搜索NamingContainer,还通过在所有其他NamingContainer组件中进行搜索,从而通过相对客户端ID(即,不以开头)增强了树中JSF组件的引用/查找。复合组件固有地也是NamingContainer组件。

您的第一次尝试失败了,因为它找到了组合本身而不是面板组,但是JS /
ajax却又未能更新,因为id="myComponent"在生成的HTML输出中不存在任何HTML元素。

您的第二次尝试成功了,因为它最终找到了真正的面板组(注意:因为它也在所有其他NamingContainer组件中进行了搜索;如果您使用<f:ajax>代替,这仍然会失败<a4j:ajax>)。

解决问题的正确方法不是#{cc.attrs.id}在JSF组件上使用,而是#{cc.clientId}在纯HTML元素上使用。

<span id="#{cc.clientId}">

(是的,使用一个<span><div>代替<h:panelGroup>内部的<cc:implementation>

这样,JSF可以通过客户端ID找到组件(以便生成正确的ajax响应),
JS可以通过客户端ID找到HTML元素(以便基于ajax响应更新正确的HTML元素)。



 类似资料:
  • 问题内容: 我有一个带有选项卡的页面,我想在单击选项卡时仅通过ajax渲染不同的部分。我有一些代码,但我认为这不是最有效的方法。我希望有人能帮助我解决已经存在的代码,或者如果有一种更简单的方法,我将不胜感激。谢谢! HTML标签 学校负责人 最新JS 路线 问题答案: 请参阅我对上一篇文章的回答。这将为您提供一个在Rails中的AJAX想法:完成模型#更新后显示模型#新表单 您可以做的是在操作中呈

  • 我有一个组件,我想在用户点击后显示/隐藏。 它是这样的: 和 只需将wasPressed属性适当地设置为true或false。我正在使用<代码> 问题是“我的按钮”的“渲染”属性的值。它明确地包括两个方面:解释和显示按钮。 只要始终存在(它只更改它的标签),仅在属性为真时才存在。否则它说: malformedXML:更新期间:找不到解释 我如何解决这个问题? 我不想恢复到在源代码中隐藏元素,所以我

  • 问题内容: 对于那里的MVC专家来说,这应该相对简单,但我仍在学习中。 简单来说,我有一个视图不是强类型的。 在此视图上,我有一个文本框,使用jQuery的AutoComplete对其进行了扩展 当用户在文本框中键入内容时,自动完成功能将对Controller进行AJAX调用,该Controller会调用存储过程,并返回具有2个属性的JSON记录集合: ID (商品的标识符) 名称 (商品名称)

  • 我的程序出了什么问题?我觉得一切都很好。我的方法获取所选值“REFERENCE”,并将布尔值设置为showReference。但是,如果我在p:ajax中使用update=“targetPanel”,我的页面无法呈现。当我使用update=“entryForm”时,它可以渲染h:panelGroup。 我错过了什么? 我的页面。xhtml 关键因子值。Java语言 我的豆子。Java语言

  • 我想渲染一个。但是,当我尝试使用Apache时,它将页面呈现为文本而不是html。 在vhost配置中,如果我尝试呈现索引。php,它可以正确执行。但是当我将DirectoryIndex更改为index时。phtml并尝试呈现索引。phtml存在于公共目录中,它只是呈现文本。 vhost配置为:ServerName parminder。com DocumentRoot“C:/workspace/p

  • 所以我有一个非常简单的glsl着色器,可以用纹理和平行光渲染对象。 现在我有一个非常艰难的时间试图得到的纹理显示,其他一切工作,除此之外。 当我禁用着色器(glUseProgram(0))时,纹理以黑色和白色渲染,但当我启用它时,整个网格是单一颜色,没有纹理,当我尝试不同的纹理时,它会改变颜色。 这就是我加载纹理的方式 这就是我如何绑定我的纹理 这是我的顶点着色器 这是我的碎片着色器 最后但并非最