我正在使用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操作不兼容,这导致异常。
我希望能够做的是在加载表单时,当comment属性有一些现有文本时,将selectBooleanButton组件的初始状态设置为'on',当它为空时将其设置为'off'。我正在寻找一种方法来解决这个问题,这不需要我在模型中为我想要隐藏面板的每个实例创建一个属性,因为这将导致数十个和几十个属性,因为我的真实世界形式很多这些评论部分非常大。
答案 0 :(得分:1)
我也在Primefaces论坛上发布了这个问题,但也没有收到任何答案,所以此时可能没有一个很好的解决方案,或者至少没有一个已经共享的问题。我最终要解决的问题是创建组件的两个版本,并使用rendered属性来控制使用哪个版本,如下所示:
<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');" />