SalesForce (VisualForce): RERENDER - Tirez les valeurs de la page, pas l'enregistrement?

StackOverflow https://stackoverflow.com/questions/8976144

Question

Je suis coincé sur mon argument rendu ici - je suis assez positif que je tire des valeurs de l'enregistrement lui-même et non de la page Visualforce. Lorsque je modifie la valeur (are_you_kp__c) de l'enregistrement à un "non" - le rendu PageBlockSection Shoud, mais pour une raison quelconque, ce n'est pas le cas. Quelqu'un sait-il pourquoi?

Je pense que j'ai besoin d'un travail de contrôleur ici - mais je ne sais pas où aller à partir d'ici ...

<apex:pageBlock title="New Bid" mode="maindetail" tabStyle="Proposal__c">
    <apex:messages/>
    <apex:actionRegion>
    <apex:pageBlockSection columns="2" title="Bid Information" collapsible="false" showHeader="true">
        <apex:inputField value="{!rfp.Bid_Amount__c}"/>
        <apex:outputField value="{!rfp.Bid_Date__c}"/>
        <apex:inputField value="{!rfp.Bid_Deliver_By__c}"/>
        <apex:inputField value="{!rfp.Bid_Comments__c}"/>
        <apex:pageBlockSectionItem>
               <apex:outputLabel value="Are you the Key Appraiser?"/>
               <apex:outputPanel>             
                   <apex:inputField value="{!rfp.are_you_kp__c}" required="true">
                       <apex:actionSupport status="StatusChange" event="onchange" rerender="PageErrors, appraiserInfo"/>
                       <apex:actionStatus startText="Updating page ..." id="StatusChange"/>
                   </apex:inputField>  
               </apex:outputPanel>
        </apex:pageBlockSectionItem> 
    </apex:pageBlockSection>
    </apex:actionRegion>
    <apex:pageBlockSection title="Testing" columns="2" rendered="{!rfp.are_you_kp__c == 'No'}" id="appraiserInfo">
        <apex:pageBlockSectionItem>
            <apex:outputLabel value="Single Point of Contact" for="spoc"/>
                <apex:selectList id="spoc" value="{!rfp.SPOCL__c}" size="1" title="Single Point of Contact Select">
                    <apex:selectOptions value="{!SPOCS}"></apex:selectOptions>
                </apex:selectList>
        </apex:pageBlockSectionItem>
    </apex:pageBlockSection>
</apex:pageBlock>

Mise à jour - enveloppé l'élément rendu dans OutputPanel avec ID correct: Ayez toujours le problème de basculer mon booléen rendu à la suite d'un changement sur un champ d'entrée - comment pourrais-je basculer cela dans le contrôleur? Je pense que je dois évaluer si la valeur d'entrée = non, et définir le rendu sur true par cela - je ne sais pas comment ...

<apex:outputPanel id="appraiserInfo">
<apex:pageBlockSection title="Testing" columns="2" rendered="{!rfp.are_you_kp__c == 'No'}">
    <apex:pageBlockSectionItem>
        <apex:outputLabel value="Single Point of Contact" for="spoc"/>
            <apex:selectList id="spoc" value="{!rfp.SPOCL__c}" size="1" title="Single Point of Contact Select">
            <apex:selectOptions value="{!SPOCS}"></apex:selectOptions>
            </apex:selectList>
    </apex:pageBlockSectionItem>
</apex:pageBlockSection></apex:outputPanel>

D'accord, une autre tentative - cette fois, cela fonctionne, mais je ne comprends pas vraiment pourquoi ... seulement ça fait. Ceci s'ajoute à l'ajout d'action = "{! UpdateansWer}" à l'actionSupport ci-dessus (ou ci-dessous, quelle que soit la façon dont vous le voyez)

    public pageReference updateAnswer(){
       if(this.p.are_you_kp__c == 'No')
       rfp.are_you_kp__c = 'No';
       try{
        update rfp;
          }
        catch (DmlException ex){
            ApexPages.addMessages(ex);
            return null;
       }
       return null;
    }

Code de contrôleur probablement pertinent

public ProposalExtension(ApexPages.StandardController pCon) {
    this.p = (Proposal__c)pCon.getRecord();
}
Était-ce utile?

La solution

Enveloppez l'élément dans un <apex:outputPanel> et rendez-vous, pas l'élément que vous souhaitez apparaître. Le problème est que l'élément n'est pas dans la page lorsqu'il n'est pas rendu, il ne s'agit donc pas d'une cible de travail pour le rendement.

C'est quelque chose qui attrape souvent les gens, moi y compris - j'ai écrit un article de blog à ce sujet ici: http://www.laceysnr.com/2011/10/using-rerender-to-render-one-solution.html

** ÉDITER **

Je n'ai pas eu de spot avant que vous n'aviez pas d'action spécifiée dans votre <apex:actionSupport> étiquette. Vous pouvez l'utiliser pour appeler l'action sur le contrôleur. Étant donné que la liste de sélection écrit à la valeur que vous souhaitez, vous n'avez pas vraiment besoin de faire quoi que ce soit dans le code (sauf si vous le souhaitez), vous pouvez simplement faire ceci:

// controller
public Pagereference UpdateAnswer()
{
  // do some stuff if you want
  return null
}

// page
<apex:actionSupport action="{!UpdateAnswer}" status="StatusChange" event="onchange" rerender="PageErrors, appraiserInfo"/>

J'espère que cela pourra aider!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top