Take the 2-minute tour ×
Salesforce Stack Exchange is a question and answer site for Salesforce administrators, implementation experts, developers and anybody in-between. It's 100% free, no registration required.

I am currently calling an APEX method (in a controller) with variables from Javascript. I would like to reflect the changes made in the controller in the page. I am using an apex:actionFunction to call the method and then I am using another actionFunction to reRender a block of the page. I believe the changes are taking place in the controller (I can make logs of the changes) and I think the rerender is working, but the new values are not being shown on the page. They will only be shown if I force a refresh by pressing a button, or similar.

I have been looking at a number of examples, but I have not found anything useful for this particular issue. Here is a summarized version of my code:

//page


<apex:actionFunction name="rerenderInfoBlock" rerender="InfoBlockContainer" />

...

<apex:actionFunction action="{!runControllerMethod}" name="newCustomerRecruitMonitorSelected" rerender=""> 
    <apex:param name="monitorId" assignTo="{!monitorId}" value="" />
</apex:actionFunction>

...

runControllerMethod(parameterVar);
rerenderInfoBlock();
alert("{!objectReference.changedProperty}");//this property will not be changed

//controller

public PageReference runControllerMethod(){
    //get the parameters etc and make a change to a few properties
    return null;
}

Is there some step I am missing? I am guessing I have to tell the javascript to somehow go back to the server and get the updated values, but I am not sure how to do this... Would be great if any answers contained links to references. Thanks.


Edit, Here is the output panel that I am trying to rerender:

<apex:outputPanel id="InfoBlockContainer">
    <apex:pageBlock id="InfoBlock" rendered="{!showBlock == true}">
        ...
share|improve this question
    
Also use a single Form Tag .And please use the getter and setter for all the properties you want back on page –  Mohith Kumar Dec 10 '12 at 6:57
add comment

1 Answer

up vote 2 down vote accepted

Several possibilities here.

  • I'm not sure an actionFunction that has no controller action is guaranteed to re-poll the controller. You should just move your rerender property of "InfoBlockContainer" to your newCustomerRecruitMonitorSelected actionFunction.
  • Your JS code should be calling newCustomerRecruitMonitorSelected(parameterVar), not runControllerMethod(parameterVar) -- the "name" param of an actionFunction becomes the JS function, while JS knows nothing about the controller param names. (To reduce errors like this on my own part, I generally name my controller methods and my actionFunctions the same thing, where appropriate.) This error would show up in a JS console/debugger.
  • a JS actionFunction method fires instantly, and asynchronously does the rerender. Therefore, your alert statement will always return the unchanged property, since it's pretty much a guarantee that the browser will fire it before the async request returns and does the rerender.

Without a little more detail about what you're rerendering and how, it's hard to diagnose further, but start with those.

share|improve this answer
    
Thanks for the answer. It has been helpful so far. The newCustomerRecruitMonitorSelected was a mistake on my part and should have been runControllerMethod (sorry for the confusion). Your 1st and 3rd point are correct. If I put an alert before the 'rerender' to give it more time, the page will update. I am not sure about how to fix this though. You say just move the render property of 'InfoBlockContainer' to the Controller function, but I am not sure what this involves. I will update the question with the 'InfoBlockContainer' item. –  lindon fox Dec 10 '12 at 6:53
    
What i'm saying is put the "rerender="InfoBlockContainer"" into the newCustomerRecruitMonitorSelected actionFunction declaration, and delete the rerenderInfoBlock actionFunction and its calling JS. You only need one actionFunction, since the rerender occurs after the action is complete. –  jkraybill Dec 10 '12 at 6:58
    
OK I understand you now - sorry. I thought you were saying to put it in the controller side of the code. Got it now and it works - thanks. –  lindon fox Dec 10 '12 at 7:06
    
To address the first point in the answer - the lack of an actionfunction doesn't stop the controller being polled. The full postback still takes place and the latest values from the controller are used to construct the elements of the page that are rerendered. –  Bob Buzzard Dec 10 '12 at 8:25
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.