a4j:在表单加载时触发commandButton onbegin事件

时间:2012-11-09 19:20:31

标签: jsf-2 richfaces

我遇到了a4j:commandButton的问题。我想要完成的是:

我有一个提交和取消按钮的表单。当用户单击提交按钮时,我希望禁用这两个按钮,并弹出一个要求用户确认的弹出窗口。一旦用户确认,如果存在验证错误,我希望重新启用提交和取消按钮。我尝试了很多解决方案,但似乎都没有。如果您有比下面更好的解决方案,请发布。我的问题与下面的代码有关

                        <h:panelGrid id="submitPanel" columns="2">
                        <a4j:commandButton id="addRequestButton" render="addRequestButton,cancelButton" onbegin="#{addRequestBean.disableSubmitButton()}" styleClass="LoginButtonStyle" value="Submit" 
                                            disabled="#{addRequestBean.submitEnabled}" oncomplete="#{addRequestBean.enableSubmitButton()}"> 
                            <rich:componentControl target="popup" operation="show" />
                        </a4j:commandButton>
                        <h:commandButton  id="cancelButton" styleClass="LoginButtonStyle" value="Cancel" action="main" disabled="#{addRequestBean.submitEnabled}"> 
                        </h:commandButton>
                    </h:panelGrid>
                    <rich:popupPanel id="popup" modal="true" autosized="true" resizeable="false">
                        <f:facet name="header">
                            <h:outputText value="Verify"></h:outputText>
                        </f:facet>
                        <h:panelGrid id="popupgrid" columns="1">
                            <h:outputText styleClass="labelFontStyle" escape="false" value="All changes are final. &lt;br /&gt;Do you wish to continue?"></h:outputText>
                            <h:outputLabel styleClass="labelFontStyle" value="" for="">  
                            </h:outputLabel>
                        </h:panelGrid>
                        <h:panelGrid columns="2">
                            <h:commandButton  styleClass="LoginButtonStyle" value="Ok"  action="#{addRequestBean.saveRequest}"  onclick="#{rich:component('popup')}.hide()"> 
                            </h:commandButton>
                            <h:commandButton  styleClass="LoginButtonStyle" value="Cancel" onclick="#{rich:component('popup')}.hide()"> 
                            </h:commandButton>
                        </h:panelGrid>
                    </rich:popupPanel>

ViewScoped Bean。

我希望onbegin事件将backing bean变量设置为disabled,并使用oncomplete方法重新启用它。麻烦是onbegin事件触发表单加载,因此禁用提交和取消按钮。必须有一些我做错的事情,如果没有,是否有解决方法?如果有更好的解决方案,请再次发布。

由于

1 个答案:

答案 0 :(得分:0)

虽然我没有看到在显示模式弹出窗口后需要禁用这两个按钮(根据定义,模式弹出窗口意味着在弹出窗口关闭或刷新页面之前,该页面上不可能执行任何其他操作),以及你还没有说明你是否希望默认禁用提交按钮(这是你的代码所指示的),你可以通过

来实现它。
  1. 包裹<a4j:outputPanel/>中的两个按钮。这样,无论如何,这两个按钮都被该页面上的任何ajax动作重新调整。另外action="main"对取消按钮做了什么?这将工作。此外,您选择的<h:commandButton/>意味着它不会触发ajax请求来更新视图中的任何内容

    <a4j:outputPanel ajaxRendered="true" layout="block">
    <a4j:commandButton id="addRequestButton" styleClass="LoginButtonStyle" action = "#{addRequestBean.toggleSubmitButtonState}"  value="Submit" disabled="#{addRequestBean.submitEnabled}" oncomplete="#{rich:component('popup')}.show()"/> 
    <h:commandButton id="cancelButton" styleClass="LoginButtonStyle" value="Cancel" action="main" disabled="#{addRequestBean.submitEnabled}"/> 
    </a4j:outputPanel>
    
  2. 为您的按钮添加一个切换按钮状态的方法表达式

      public void toggleSubmitButtonState(){
        this.submitEnabled = !submitEnabled;     
    
      }
    

    你真的不应该将两个按钮的状态绑定到相同的布尔值,因为在语义上,他们做了不同的事情,但我会坚持你已经拥有的东西

  3. 我建议你从当前与所有其他组件共享的形式中取出弹出窗口,但再次,让我们使用你所拥有的。再一次,你在这里选择<h:commandButton/>将确保你没有做任何ajax。添加<f:ajax/>或将这些按钮转换为<a4j:commandButton/>

      <h:commandButton  styleClass="LoginButtonStyle" value="Ok"  action="#{addRequestBean.saveRequest}"  oncomplete="#{rich:component('popup')}.hide()"/>
      <h:commandButton  styleClass="LoginButtonStyle" value="Cancel" onclick="#{rich:component('popup')}.hide()"/> <!-- This won't work as is, it will refresh the entire page instead of just firing the javascript event. Change to a4j-->
    
  4. 向该页面添加<f:event/>事件处理程序以检查验证失败。

             在您的支持bean中,我们添加了检查验证失败的方法

    public void checkValidationFailures(){
    
    FacesContext context = FacesContext.getCurrentInstance();
    if (context.isPostback() && context.isValidationFailed()){ //if the request is a postback and validation failed
    
       this.submitEnabled = true;             
    
      }
    }
    

    仅当您在ValidatorException方法中抛出saveRequest时才会有效。否则,您将不得不在方法中自己处理失败并明确将submitEnabled值设置为true,然后重新调整按钮。这就是为什么你可能应该将弹出窗口中的那些按钮转换为a4j