1

我正在使用 Primefaces 和 MyFaces。我想使用 selectBooleanButton 组件来控制长且相当复杂的表单中其他组件的可见性。

简化示例代码:

<p:selectBooleanButton 
         onLabel="Comment" offLabel="Comment" 
         onIcon="ui-icon-check" offIcon="ui-icon-close"
         value="#{not empty myBean.comment}"
         onchange="toggleDisplay(this.checked,'myForm:commentPanel');" /> 

<h:panelGroup id="commentPanel" 
              style="display:#{empty myBean.comment ? 'none' : 'block'}">
   <p:inputTextarea value="{myBean.comment}"/>
</h:panelGroup>                                     

onchange 属性中的 javascript 只是将显示样式从无切换为阻止,反之亦然以隐藏或取消隐藏面板组。我希望/需要组件保留在视图中,我不想使用渲染属性来完全删除它们。

我遇到麻烦的地方是因为 setBooleanButton 组件的 value 属性中使用了 EL 构造。我确实意识到这个 EL 语句与 set 操作不兼容,这会导致异常。

我想要做的是在加载表单时,当评论属性有一些现有文本时,将 selectBooleanButton 组件的初始状态设置为“on”,当它为空时设置为“off”。我正在寻找一种解决此问题的方法,它不需要我在模型中为我想要隐藏面板的每个实例创建一个属性,因为这会导致数十个属性,因为我的真实世界形式非常大,其中有许多评论部分。

4

1 回答 1

1

我也在Primefaces论坛上发布了这个问题,也没有收到任何答案,所以目前这个问题可能没有很好的解决方案,或者至少没有一个已经共享的解决方案。我最终解决这个问题的方法是创建两个版本的组件,并使用渲染属性来控制使用哪个版本,如下所示:

<p:selectBooleanButton 
     onLabel="Comment" offLabel="Comment" 
     onIcon="ui-icon-check" offIcon="ui-icon-close"
     value="true" rendered="#{not empty myBean.comment}"
     onchange="toggleDisplay(this.checked,'myForm:commentPanel');" /> 

<p:selectBooleanButton 
     onLabel="Comment" offLabel="Comment" 
     onIcon="ui-icon-check" offIcon="ui-icon-close"
     value="false" rendered="#{empty myBean.comment}"
     onchange="toggleDisplay(this.checked,'myForm:commentPanel');" /> 
于 2012-12-10T18:31:07.987 回答