2

我试图通过定义一个操作方法并将其绑定到组件的“禁用”属性来禁用 jsf 组件。

我的 JSF 组件片段

<h:form id="bulk_sch_form1">
    <a4j:commandButton id="alls" value="a. Search records form this company"
        action="#{recordsTransferSearch.actionSearch}"
        reRender="srtDlGrd, dlod_msg_grd, pending_student_table"

        disabled="#{not recordsTransferSearch.isDisabled}">

    </a4j:commandButton>
</h:form>

支持 bean 动作方法

public boolean isDisabled() {
    if (searchResults != null) {
        return true;
    }
    return false;
}

searchResults 只是在返回成功的搜索结果后进行评估。但正如标题中所述,它根本没有调用操作方法isDisabled(),因此没有任何反应。

只有在我刷新页面时才会调用操作方法。

谢谢。

4

1 回答 1

4

您应该使用disabled字段获取器,例如 in disabled="#{not recordsTransferSearch.disabled}",或者如果您的 EL 支持方法调用,即版本 2.2+,您应该()在方法调用的末尾添加空括号 , ,例如 in disabled="#{not recordsTransferSearch.isDisabled()}"

请注意,就目前而言,与您在评论中的建议相反,disabled="#{bean.isDisabled}"将触发Property 'isDisabled' not found错误。


根据您的评论,您并不完全了解disabled属性在 JSF 中的工作原理。您似乎希望该按钮在某些 javascript 事件和/或通过某些操作/操作侦听器方法所做的某些更改时启用/禁用。不是这种情况。仅当属性的 EL 表达式disabled相应地计算为真/假时,该按钮才被禁用/启用。您甚至可以对其进行测试:当您删除 HTML 的 disabled 属性时input,有效地使其在客户端启用并调用该按钮,您会看到不会调用任何操作方法,而是会在服务器上重新评估其 disabled 属性并且,因为它会评估为false,所以不会调用任何方法。

为了使其按预期工作,您需要通过 AJAX 调用重新呈现命令按钮(通过在另一个更改方法结果的属性中指定其 id以便返回reRender),或同步(强制执行所需的评估)所以禁用条件将被评估为。<a4j:commandButton>isDisabled()falsedisabledfalse

此外,最好通过一个基本示例来了解它是如何工作的。

风景:

<h:form>
    <h:commandButton id="disabled" value="Disabled command button"
                     action="#{bean.disabledSubmit}"
                     disabled="#{not bean.disabled}">
    </h:commandButton>
    <h:commandButton id="simple" value="Enable a disabled button"
                     action="#{bean.simpleSubmit}">
        <f:ajax render="disabled"/>
    </h:commandButton>
</h:form>

豆子:

@ManagedBean
@ViewScoped
public class Bean implements Serializable{

    private boolean searchResults = false;

    public boolean isDisabled() {
        return searchResults;
    }

    public String disabledSubmit() {
        return null;
    }

    public String simpleSubmit() {
        searchResults = true;
        return null;
    }

}
于 2013-04-24T10:24:39.497 回答