I just dealt with this and was surprised that I was not able to use the apex:actionstatus and facet combination that I typically use to disable buttons that initiate queries. Turns out that the important detail is that the actionstatus tag requires us to rerender a component. When this rerendering occurs, you potentially get another form submission. It may have to do with the redirect my page was doing after the save. The good folks over at the stack exchange saved my bacon once again. Their approach to disable your button is the following:
Button click calls an actionfunction js. The actionfunction does some javascript to disable the buttons using jquery, then calls the actionfunction component, which describes the controller method to run and what to do when the method completes.
I changed up the accepted stack exchange solution in two ways:
1. The button, while gray and disabled, still behaved like a button (it was still clickable). I ended up using jquery to remove the btn class (which makes it clickable) and also restore the btn class, after any page messages/errors are displayed:
function buttonsEnabled(enabled) { // to disable the button if (enabled === false) { var $b = jQuery('.btn'); $b.removeClass('btn'); $b.addClass('btnDisabled'); $b.toggleClass('btnDisabled', true).attr('disabled', 'disabled'); } else { var $b = jQuery('.btnDisabled'); $b.toggleClass('btnDisabled', false).attr('disabled', null); $b.removeClass('btnDisabled'); $b.addClass('btn'); } }
2. If you have some validations on your page, you'll want to be sure you're re-rendering the messages tag in your action function. In this example, my pagemessages has the id "msgs".
<apex:form id="form"> <apex:actionFunction name="doSomeWorkActionFunction" action="{!mySave}" oncomplete="buttonsEnabled(true);" rerender="msgs"> </apex:actionFunction> <apex:pagemessages escape="false" id="msgs"/> <apex:pageblock mode="Detail" id="pageblock" > <apex:pageblockButtons > <apex:commandButton id="mysavebutton"
onclick="return doSomeWork();" value="Save" /> <apex:commandButton action="{!myCancel}" value="Cancel" immediate="true" /> </apex:pageblockButtons>
No comments:
Post a Comment