JSF:Ajax Rerender复合组件

时间:2014-08-04 20:29:11

标签: ajax jsf richfaces components composite

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

我有一个JSF复合组件A,我传递一个自定义属性值和另一个复合组件B的ID。每当我在组件A上更改某些东西时,组件B应该用a4j:ajax函数重新渲染。

这很有效。

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

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

在MB&#39的构造函数中,values设置为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>

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

在你的mycomp中:选择(你没有给出代码),尝试更新@form,或者传递表单ID代替你的compB id。

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