我遇到了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. <br />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事件触发表单加载,因此禁用提交和取消按钮。必须有一些我做错的事情,如果没有,是否有解决方法?如果有更好的解决方案,请再次发布。
由于
答案 0 :(得分:0)
虽然我没有看到在显示模式弹出窗口后需要禁用这两个按钮(根据定义,模式弹出窗口意味着在弹出窗口关闭或刷新页面之前,该页面上不可能执行任何其他操作),以及你还没有说明你是否希望默认禁用提交按钮(这是你的代码所指示的),你可以通过
来实现它。包裹<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>
为您的按钮添加一个切换按钮状态的方法表达式
public void toggleSubmitButtonState(){
this.submitEnabled = !submitEnabled;
}
你真的不应该将两个按钮的状态绑定到相同的布尔值,因为在语义上,他们做了不同的事情,但我会坚持你已经拥有的东西
我建议你从当前与所有其他组件共享的形式中取出弹出窗口,但再次,让我们使用你所拥有的。再一次,你在这里选择<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-->
向该页面添加<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
。