<h:selectBooleanCheckbox id="deactivate" title="select to deactivate" />
我的JSF页面上有一个复选框和一个按钮。我希望仅在选中复选框时启用该按钮。
在我的java类中没有手动javascript和没有监听器方法的JSF方式是什么。应该有一种方式可以使用类似的表达式
"panel group rendered=#{}"
一个按钮呈现为启用,一个按钮呈现或禁用。
答案 0 :(得分:14)
在我的java类中没有javascript和没有监听器方法的JSF方式是什么
这显然是不可能的。我收集到你实际上的意思,“没有手动编写的JavaScript”(因此你接受<f:ajax>
使用的JSF生成的JavaScript)和“没有手动编写的监听器方法”(因此你接受JSF自己的魔法组件树状态)。
在这种情况下,应该这样做:
<h:form>
<h:selectBooleanCheckbox binding="#{checkbox}">
<f:ajax render="button" />
</h:selectBooleanCheckbox>
<h:commandButton id="button" value="submit"
action="#{bean.submit}"
disabled="#{not checkbox.value}" />
</h:form>
这就是全部。不需要额外的JS代码或JSF bean属性或侦听器方法。只需submit()
操作方法。
此示例中的binding
属性会将UIComponent
<h:selectBooleanCheckbox>
的#{checkbox.value}
引用放在变量名称checkbox
下的Facelet范围内。 EL表达式UISelectBoolean
返回组件的value
属性,该boolean
属性表示How does the 'binding' attribute work in JSF? When and how should it be used?组件已经是disabled
,可以在命令组件的disabled="#{not checkbox.value}"
中使用属性。
注意:如果您在较旧的Eclipse版本中的{{1}}行遇到错误的EL错误,则需要按如下方式对其进行配置: Window&gt;偏好&gt;网络&gt; JavaServer Faces工具&gt;验证&gt; <类型强制问题>一元操作布尔强制问题将其设置为警告或忽略而不是错误。自Eclipse Mars以来,这不再是必要的了。
答案 1 :(得分:3)
你需要通过在ajax调用上调用valueChangeListener来实现这一点,这样你就可以启用/禁用按钮
这是复选框和按钮
<h:selectBooleanCheckbox id="deactivate" title="select to deactivate"
valueChangeListener="#{bean.myChangeListener}" onchange="submit()">
<h:selectManyCheckbox value="#{user.favNumber1}">
<f:selectItem itemValue="1" itemLabel="Number1 - 1" />
<f:selectItem itemValue="2" itemLabel="Number1 - 2" />
<f:selectItem itemValue="3" itemLabel="Number1 - 3" />
<f:ajax event="change" execute="@this" render="dummyButton"/>
</h:selectManyCheckbox>
<h:commandButton id="dummyButton" value="OK" render="#{renderBean.myButton}">
您需要创建一个只有一个属性的渲染类,其值将在侦听器方法中设置i-e bean#myChangeListener
public class RenderBean{
boolean myButton;
public RendeBean(){
myButton = true;
}
public void enableButton(){
myButton = true;
}
public void disableButton(){
myButton = false;
}
}
这是您的bean#myChangeListener
public void myChangeListener(ValueChangeEvent e){
RenderBean rb = (RenderBean) FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get("renderBean");
if(e.getNewValue().toString().equals("1"))
rb.enableButton();
else
rb.disableButton();
}