1

我有一个带有 ajax 事件的复选框,在更改值后,复选框将更改我的 bean 中的布尔值。这个 ajax 事件还应该呈现一个具有属性的 panelGrid rendered="#{!*the bean's boolean*}"。这意味着 panelGrid 应该在未选中时可见,并且在选中时可见。默认情况下,布尔值将设置为 false(通过@PostConstruct)。

这是相应的代码片段:

<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()andsetUseAddress()将在 valuechange 时执行。

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

4

1 回答 1

3

不要指向具有属性的f:ajax元素rendered,因为当这些元素不会被渲染时,就不可能f:ajax找到它们。

f:ajax必须指向生成的 HTML DOM 树中存在的元素,并且当rendered某些 JSF 元素的属性等于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

于 2012-11-22T20:02:13.840 回答