【问题标题】:JSF checkbox listenerJSF 复选框监听器
【发布时间】:2013-06-14 13:53:51
【问题描述】:
<h:selectBooleanCheckbox id="deactivate" title="select to deactivate" />

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

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

"panel group rendered=#{}" 

一个按钮被渲染为启用,一个按钮被渲染或禁用。

【问题讨论】:

  • 没有 JavaScript 或 POST/refresh,你不能。
  • @Alexandre Lavoie 好的,那你有什么建议?
  • this 问题中已经做了一些事情,因为 JSF 渲染 HTML 是一样的。
  • @Spring 您正在寻找的是可能的,但您也可以使用 ajax,但至少您需要一个监听器
  • 感谢您的赏金。对未来的提示,如果您尽可能长时间地保持赏金开放(7 天),您最终将通过“精选”列表获得偶然发现您的问题的用户的同情投票,从而轻松赢回已花费的声誉。

标签: jsf


【解决方案1】:

您需要通过在 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();
}


【讨论】:

    【解决方案2】:

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

    这根本不可能。我猜你的意思是,“没有手动编写的 JavaScript”(因此您接受 &lt;f:ajax&gt; 使用的 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 属性将把 &lt;h:selectBooleanCheckbox&gt;UIComponent 引用放在变量名称 checkbox 下的 Facelet 范围内。 EL 表达式#{checkbox.value} 返回组件的value 属性,如果UISelectBoolean 组件已经是boolean,则可以在命令组件的disabled 属性中使用。

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

    另见:

    【讨论】:

    • 说真的,库拉索岛需要开发人员吗? :) 我现在在荷兰,正在寻找一个温暖的地方。
    • 我在家为荷兰的一家公司工作。只需寻找一家允许在家工作的公司;)
    • 这很完美,但我的按钮 CSS 有问题,它在禁用时不会“看起来”被禁用。我给这样的按钮样式 class="greyishBtn submitForm" 有什么想法吗?
    • 这个问题与最初的问题无关。它适用于我没有任何额外 CSS 的空白游乐场项目。也许您已经在通用样式表中的某处覆盖了input[disabled]
    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 2011-06-29
    • 1970-01-01
    • 2012-09-22
    • 2013-05-05
    相关资源
    最近更新 更多