两个不同的 h:commandButton 操作的条件呈现



使用的技术:

JSF 2

总理面孔

问题陈述 :

我们有一个下拉列表如下 -

<h:selectOneMenu value ="#{bean.value}"> 
<f:ajax event="change" listener="#{bean.processValue}" 
render="{one,two or panel}" />   //render correct id based on approach
<f:selectItem itemValue = "1" itemLabel = "Item 1" /> 
<f:selectItem itemValue = "2" itemLabel = "Item 2" />
<f:selectItem itemValue = "3" itemLabel = "Item 3" /> 
<f:selectItem itemValue = "4" itemLabel = "Item 4" /> 
</h:selectOneMenu>          

如果用户选择项目 2 ,则会显示一个按钮,单击该按钮将打开一个弹出菜单。 如果用户选择项 1 或 3 或 4,则会显示另一个按钮,该按钮在单击时触发业务操作。

我们能够使用f:ajax获得 AJAX 对h:selectOneMenu的调用。 我们正在使用renderf:ajax属性

这工作正常。

问题是如何在 AJAX 响应上设计两个按钮。

在不使用 JSTL 的情况下接近一个:

<h:commandButton id="one" value="Submit" onClick="openPopup" rendered="#{bean.render}">
<h:commandButton id="two" value="Submit" action="#{bean.businessAction}" rendered="#{bean.render}">

其中#{bean.render}将检查单击的项目的值并返回真/假。

使用 JSTL 的方法二:

将两个按钮包装在同一面板网格中,并仅渲染面板网格。在 panelGrid 中使用 JSTL 来控制渲染。

<h:panelGrid id="panel">
<c:choose>     
<c:when test = "${itemVlaue == 2}"> // use appropriate EL expression 
<!-- render command button 1 to open pop up --> 
</c:when>
<c:when test = "${itemVlaue == 1 or 3 or 5  }"> // use appropriate EL expression 
<!-- render command button 2 to invoke action --> 
</c:when>
</c:choose>
</h:panelGrid>

我已经在互联网上搜索过,似乎方法一更正确,因为不建议在 JSF 中使用 JSTL 来控制渲染。

但问题是:

当只使用一个命令按钮时,我们最终会创建两个命令按钮。

另外,如果两个命令按钮只需要一个id怎么办。也就是说,在任何时间点都应该有一个

人存在。请指教

您的Y问题在以下方面得到解答:

  • 如何使用 AJAX 的 Primefaces 刷新 JSTL 测试?
  • JSTL in JSF2 Facelets...意义?
  • Ajax 更新/渲染不适用于具有渲染属性的组件

您的 X 问题答案如下:

<h:selectOneMenu value="#{bean.value}">
...
<f:ajax listener="#{bean.processValue}" render="oneAndOnly" />
</h:selectOneMenu>
...
<h:commandButton id="oneAndOnly" value="Submit"
onclick="#{bean.render ? 'openPopup();return false;' : ''}"
action="#{bean.businessAction}">
</h:commandButton>

换句话说,只需让它有条件地呈现返回false的 onclick 属性本身。

最新更新