2012-11-22 52 views
1

我有与AJAX事件复选框,在改变值,该复选框会在我的豆改变一个布尔值。这个ajax事件也应该呈现一个属性为rendered="#{!*the bean's boolean*}"的panelGrid。这意味着panelGrid在未选中时应该可见,并在选中时可见。布尔值默认设置为false(由@PostConstruct)。JSF:panelGrid中不会呈现

这是相应的代码片断:

<h:selectBooleanCheckbox id="useAddress" value="#{handleOrder.useAddress}"> 
    <f:ajax event="change" execute="useAddress" render="outputAddress" /> 
</h:selectBooleanCheckbox> 

<h:panelGrid id="outputAddress" rendered="#{!handleOrder.useAddress}" columns="2" width="468px"> 
(...) 

此代码段由<h:form />标签包围。 我getUseAddress()setUseAddress()将在valuechange执行。

我的问题是,为什么我panelGrid的始终可见

+2

相关:http://stackoverflow.com/questions/9010734/why-do-i-need-to-nest-a-component-with-rendered-some-in-another-component- w^ – BalusC

回答

3

请勿在rendered属性的元素上指向f:ajax,因为当这些元素不会被渲染时,f:ajax将无法​​找到它们。

f:ajax必须指出的元素出现在生成的HTML DOM树,当一些JSF元素的rendered属性等于false该元素不会甚至存在于HTML DOM树

更改您的代码到这个

<h:selectBooleanCheckbox id="useAddress" value="#{handleOrder.useAddress}"> 
    <f:ajax event="change" render="outputAddressWrapper" /> 
</h:selectBooleanCheckbox> 

无需对execute="useAddress"事业execute默认为@this反正

<h:panelGroup id="outputAddressWrapper"> 
    <h:panelGrid id="outputAddress" rendered="#{!handleOrder.useAddress} columns="2" width="468px"> 
     ... 

你说你panelGrid中始终可见,什么是你的bean的范围是什么?使其至少@ViewScoped

+0

这将导致您所描述的问题,我想你的意思'AJAX render'的ID应该是外板和内面板上呈现的属性上,对不对? – Aquillo

+0

是的,这是一个错字....固定 – Daniel

+0

测试和工作,听起来回想起来这样的逻辑。 – Aquillo