有条件地渲染两个不同的h:commandButton动作

时间:2018-03-16 07:33:41

标签: jsf jstl commandbutton conditional-rendering ajax-update

使用的技术:

JSF 2

Primefaces

问题陈述:

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

<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,则会显示另一个按钮,该按钮会在单击时触发业务操作。

我们可以使用h:selectOneMenu获取f:ajax的AJAX调用。 我们使用render

f: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}将检查单击项目的值并返回true / false。

使用JSTL接近二:

在同一个panelGrid中包装两个按钮,仅渲染panelGrid。在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,那该怎么办?只有一个应该在任何时间出现。

请咨询

1 个答案:

答案 0 :(得分:3)

您的Y问题在以下位置得到解答:

您的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属性。