0

这是我关于 SO 的第一篇文章。

我将 JSF2 与 Richfaces4 一起使用,但遇到以下问题:

根据下拉菜单的值,我希望禁用面板中的某些输入字段并且不需要这些字段,否则应该启用并要求这些字段。

我的 xhtml 中有以下内容

<h:selectOneMenu value="#{backingBean.field}" id="ResponseType">
    <f:selectItems value="#{backingBean.responseTypes}" />
    <f:ajax event="change" execute="@this" render="myPanel" listener="#{backingBean.responseTypeValueChange}" immediate="true"></f:ajax>
</h:selectOneMenu>
<rich:panel id="myPanel">
    <h:inputText id="input1" label="label1" value="#{backingBean.input1}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
    <h:inputText id="input2" label="label2" value="#{backingBean.input2}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
    <h:inputText id="input3" label="label3" value="#{backingBean.input3}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
    <h:inputText id="input4" label="label4" value="#{backingBean.input4}" required="#{not backingBean.flagDisabled}" disabled="#{backingBean.flagDisabled}" />
</rich:panel>

我的支持 bean 是一个 Spring bean,代码是:

public class BackingBean {
    private boolean flagDisabled;
    private String field;

    // getters and setters

    public List<SelectItem> getResponseTypes() {
        ...
        // returns values [1: Positive], [2: Negative]
    }

    public void responseTypeValueChange(AjaxBehaviorEvent event) {
        flagDisabled = "2".equals(field);
    }
}

我的问题是,当调用 responseTypeValueChange 方法时,字段变量保存上一个请求的值。所以我总是得到完全相反的行为。

我也尝试过使用 a4j:ajax 但我得到了相同的结果。

然后我更改了从事件参数中获取提交的值的方法,如下所示:

public void responseTypeValueChange(AjaxBehaviorEvent event) {
    if (event.getSource() instanceof HtmlSelectOneMenu) {
        HtmlSelectOneMenu source = (HtmlSelectOneMenu) event.getSource();
        flagDisabled = "2".equals(source.getSubmittedValue());
    }
}

以上方法有效,但我如何更新 flagDisabled 值然后调用该方法?我觉得我的解决方案不是最好的。这实际上是一个黑客。

谢谢你。

4

1 回答 1

1

经过这么多时间,在调查另一个关于 JSF 验证的问题时,我想出了如何正确调用该方法而不使用类似的东西:

if (event.getSource() instanceof HtmlSelectOneMenu) {
    HtmlSelectOneMenu source = (HtmlSelectOneMenu) event.getSource();
    flagDisabled = "2".equals(source.getSubmittedValue());
}

<h:selectOneMenu>我添加了属性execute="@this"以便在 ajax 请求中仅包含此元素。

奇怪的是,我在这里的示例中有它,但实际代码中没有。 对不起,误导的帖子家伙。

顺便说一句:这与托管 bean 的范围无关。该 bean 是会话范围的,但我什至为 Spring 创建了一个自定义视图范围,甚至使用了 JSF @ViewScope,但没有任何结果。

于 2013-10-21T15:23:41.330 回答