无法通过ajax </p:commandbutton>禁用<p:commandbutton>

时间:2012-09-21 18:36:47

标签: jsf jsf-2 primefaces

如果输入文本中没有值,我想禁用该按钮:

<p:autoComplete  id="ac" value="#{bean.selectedNet}"
    completeMethod="#{bean.complete}"
    minQueryLength="0" size="3">
    <p:ajax event="itemSelect" update="genButton" listener="#{bean.handleNetChange}"/>
    <p:ajax process="@this" update="genButton" />
</p:autoComplete> 

<p:selectManyCheckbox id="en" layout="pageDirection" value="#{bean.selectedEntity}"> 
    <f:selectItems value="#{bean.entityList}"/>
    <p:ajax update="genButton" listener="#{bean.handleNetChange}"/>
</p:selectManyCheckbox>

<p:commandButton id="genButton" value="Generate Files"
    widgetVar="startButton1"
    disabled="#{bean.disableButton}"
    actionListener="#{bean.generate}"
    onclick="PrimeFaces.monitorDownload(showStatus, hideStatus)"
    ajax="false">
    <p:fileDownload value="#{bean.streamedContent}"/>
</p:commandButton>

方法:

public void handleNetChange() {
    if (!StringUtils.isBlank(selectedNet) && !selectedEntity.isEmpty()) {
        disableButton = false;
    } else {
        disableButton = true;
    }
}

public List<String> complete(String query) {
    List<String> results = new ArrayList<String>();
    if (StringUtils.isBlank(query)) {
        selectedNet = query;
        disableButton = true;
    } else {
        ....
    }
    return results;
}

虽然itemSelect事件工作正常,但第二个事件却没有。我可以在bean中看到对complete方法的调用但是按钮没有更新

有任何建议吗?

2 个答案:

答案 0 :(得分:2)

好像您不能仅使用<p:ajax process="@this" update="genButton" />强制更新。 我会尝试直接从button更新bean

由于您使用的是primefaces,因此您可以使用RequestContext;尝试将此行添加到您的complete方法:

RequestContext.getCurrentInstance().addPartialUpdateTarget("genButton");

如果您在包裹prependId="false"上未使用form,则可能需要指定button的完整路径,例如:

RequestContext.getCurrentInstance().addPartialUpdateTarget("fooForm:genButton");

答案 1 :(得分:0)

如果要使用disabled,请不要在命令按钮上使用render属性。

<p:commandButton id="buttonId"  
actionListener="#{controller.function}"
value="#{controller.label}" 
disabled="#{controller.disableButton}" rendered="#{controller.renderButton}"  />

删除渲染后,按钮被禁用,没有任何问题。