Pergunta

Estou preso no meu argumento renderizado aqui - tenho certeza de que estou extraindo valores do próprio registro e não da página do Visualforce.Quando altero o valor (are_you_kp__c) do registro para "Não" - a seção pageblock deve ser renderizada, mas por algum motivo isso não acontece.Alguém sabe por quê?

Acho que preciso de algum trabalho de controlador aqui - mas não tenho certeza para onde ir a partir daqui...

<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>

Atualizado - envolve o elemento a ser renderizado em outputPanel com o ID correto:Ainda tenho o problema de alternar meu booleano renderizado como resultado de uma alteração em um inputField - como eu alternaria isso no controlador?Acho que preciso avaliar se o valor de inputField = Não e definir o renderizado como verdadeiro com isso - não tenho certeza de como ...

<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>

Tudo bem, mais uma tentativa - desta vez funciona, mas não entendo bem o porquê... só que funciona.Isso é um acréscimo à adição de action="{!updateAnswer}" ao actionSupport acima (ou abaixo, da maneira que você vê)

    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;
    }

Código do controlador provavelmente relevante

public ProposalExtension(ApexPages.StandardController pCon) {
    this.p = (Proposal__c)pCon.getRecord();
}
Foi útil?

Solução

Envolva o elemento em um <apex:outputPanel> e renderize novamente isso, não o elemento que você deseja que apareça.O problema é que o elemento não está na página quando não é renderizado, portanto não é um alvo funcional para nova renderização.

É algo que muitas vezes surpreende as pessoas, inclusive eu. Escrevi uma postagem no blog sobre isso aqui: http://www.laceysnr.com/2011/10/using-rerender-to-render-one-solution.html

**EDITAR**

Não percebi antes que você não tinha uma ação especificada em seu <apex:actionSupport> marcação.Você pode usar isso para chamar a ação no controlador.Como a lista de seleção está gravando o valor que você deseja, na verdade você não precisa fazer nada no código (a menos que queira), basta fazer o seguinte:

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

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

Espero que ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top