JSF:Ajax重新渲染器复合组件

JSF:Ajax重新渲染器复合组件,ajax,jsf,richfaces,components,composite,Ajax,Jsf,Richfaces,Components,Composite,我已经读了很多帖子试图解决我的问题,但没有人能帮我。。。 所以我在这里问,如果我做错了什么,是否有人能告诉我: 我有一个JSF复合组件a,我用另一个复合组件B的ID传递一个自定义属性值。每当我更改组件a上的内容时,组件B都应该使用a4j:ajax函数重新呈现 这很好用 但是,现在我需要组件B最初使用依赖于某个托管bean MB的EL表达式呈现,如下所示: <mycomp:B id="comp-b" rendered="#{MB.value gt 0}"> 在MB的构造函数上,值

我已经读了很多帖子试图解决我的问题,但没有人能帮我。。。 所以我在这里问,如果我做错了什么,是否有人能告诉我:

我有一个JSF复合组件a,我用另一个复合组件B的ID传递一个自定义属性值。每当我更改组件a上的内容时,组件B都应该使用a4j:ajax函数重新呈现

这很好用

但是,现在我需要组件B最初使用依赖于某个托管bean MB的EL表达式呈现,如下所示:

<mycomp:B id="comp-b" rendered="#{MB.value gt 0}">

在MB的构造函数上,值设置为0。 正如所料,在第一次访问页面时,组件B不会呈现

问题:

在组件A上选择某个值时,它会更改MB.value并触发ajax valueChange事件,但组件B不会显示。 如果我刷新页面或单击Url栏上的enter,则会显示组件B

我无法在此发布我的实际代码,但我将尝试显示实际行为:

Page.xhtml

<h:form>
  <mycomp:A id="comp-a" changeListener="#{MB.listener}" renderComps="comp-b" />
  <mycomp:B id="comp-b" rendered="#{MB.value gt 0}" />
</h:form>

compA.xhtml

<cc:interface>
  <cc:attribute name="renderComps" />
  <cc:attribute name="listener" method-signature="void m(javax.faces.event.ValueChangeEvent)"  />
</cc:interface>
<cc:implementation>
  <h:outputLabel value="Comp A: " />
  <myComp:select listener="#{cc.attrs.listener}"
                 render="#{cc.attrs.renderComps}"
                 />
</cc:implementation>

compB.xhtml

<cc:interface>
</cc:interface>
<cc:implementation>
 <span id="cc.clientId">
  <h:outputLabel value="Comp B" />
 </span>
</cc:implementation>


我感谢你的帮助

您应该确保为每个ajax请求更新mycop:B的父组件。由于您的组件最初没有呈现,您将无法引用它进行更新,因此需要更新其父级,这将重新计算所有
rendered=
表达式

在mycomp中:选择(您没有提供代码),尝试更新
@form
,或传递表单id以代替您的compB id


要确定选择后更新的组件,可以使用浏览器调试工具观察收到的XHR响应。

这对我来说非常有意义。成功了!关于XHR技巧,我不需要它来解决这个问题,但是它对于调试非常有用,我稍后会检查它。非常感谢你!