disabled="#{notrecordsTransferSearch.isDisabled}" 不调用 isDisabled() 方法

Swi*_*tch 2 jsf richfaces ajax4jsf jsf-2

我试图通过定义一个操作方法并将其绑定到组件的“disabled”属性来禁用 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>
Run Code Online (Sandbox Code Playgroud)

支撑豆作用方法

public boolean isDisabled() {
    if (searchResults != null) {
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

searchResults 仅在返回成功的搜索结果后进行评估。但正如标题中所述,它isDisabled()根本没有调用操作方法,因此什么也没有发生。

仅当我刷新页面时才会调用操作方法。

谢谢。

sku*_*sel 5

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

请注意,就目前情况而言,与您在评论中的建议相反,disabled="#{bean.isDisabled}"将触发属性“isDisabled”未找到错误。


根据您的评论,您不完全理解disabled属性在 JSF 中的工作原理。看来您希望按钮在某些 javascript 事件和/或通过某些操作/动作侦听器方法所做的一些更改中启用/禁用。不是这种情况。仅当属性的 EL 表达式相应地计算为 true/false 时,该按钮才被禁用/启用disabled。您甚至可以测试它:当您删除 HTML 的禁用属性input,有效地在客户端启用它并调用该按钮时,您将看到不会调用任何操作方法,而是将在服务器上重新评估其禁用属性并且,由于它的计算结果为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>
Run Code Online (Sandbox Code Playgroud)

豆子:

@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;
    }

}
Run Code Online (Sandbox Code Playgroud)