6
<h:selectBooleanCheckbox id="deactivate" title="select to deactivate" />

我的 JSF 页面上有一个复选框和一个按钮。我希望仅在选中复选框时才启用该按钮。

在我的 java 类上没有手动 javascript 和侦听器方法的 JSF 方法是什么。应该有办法做到这一点,也许是这样的表达;

"panel group rendered=#{}" 

一个按钮呈现启用和一个按钮呈现或禁用。

4

2 回答 2

14

在我的 java 类上没有 javascript 和没有侦听器方法的 JSF 方法是什么

这显然是不可能的。我猜您的意思实际上是“没有手动编写的 JavaScript”(因此您接受由 使用的 JSF 生成的 JavaScript <f:ajax>)和“没有手动编写的侦听器方法”(因此您在组件树状态上接受 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属性会将 Facelet 范围内的UIComponent引用<h:selectBooleanCheckbox>放在变量 name 下checkbox。EL 表达式#{checkbox.value}返回value组件的属性,该属性表示如果UISelectBoolean组件已经 a boolean,可以在命令组件的disabled属性中使用。

注意:如果您在disabled="#{not checkbox.value}"旧 Eclipse 版本的行中遇到不正确的 EL 错误,则需要按如下方式配置它:Window > Preferences > Web > JavaServer Faces Tools > Validation > Type Coercion Problems > Unary operation boolean强制问题将其设置为WarningIgnore而不是Error。自从 Eclipse Mars 以来,这不再是必要的了。

也可以看看:

于 2013-06-18T13:31:00.753 回答
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}">


您需要创建一个只有一个属性的渲染类,其值将在侦听器方法中设置,即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();
}


于 2013-06-18T11:34:11.913 回答