我已经阅读了很多帖子试图解决我的问题,但没有人可以帮助我...... 所以我在这里问如果有人能告诉我我是否做错了什么:
我有一个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>
感谢您的帮助!
答案 0 :(得分:0)
您应该确保mycomp的父组件:B针对每个ajax请求进行更新。由于您的组件最初未呈现,因此您无法引用它以进行更新,因此需要更新其父级,这将重新评估所有rendered=
个表达式
在你的mycomp中:选择(你没有给出代码),尝试更新@form
,或者传递表单ID代替你的compB id。
要确定在选择时更新了哪个组件,您可以使用浏览器调试工具观察收到的XHR响应。