Salesforce (визуальная сила):Rerender - извлекать значения со страницы, а не из записи?
-
12-11-2019 - |
Вопрос
Я застрял здесь на своем отрисованном аргументе - я почти уверен, что извлекаю значения из самой записи, а не со страницы visualforce.Когда я меняю значение (are_you_kp__c) из записи на "No" - pageblocksection должен отображаться, но по какой-то причине этого не происходит.Кто-нибудь знает почему?
Я думаю, что здесь мне нужна некоторая работа с контроллером, но я не уверен, куда идти дальше...
<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>
Обновлено - обернул подлежащий рендерингу элемент в outputPanel с правильным идентификатором:Все еще есть проблема с переключением моего отображаемого логического значения в результате изменения InputField - как бы я переключил это в контроллере?Я думаю, мне нужно оценить, если значение InputField = No, и установить для rendered значение true с помощью этого - я не уверен, как это сделать...
<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>
Хорошо, еще одна попытка - на этот раз это работает, но я не совсем понимаю почему...только то, что это работает.Это в дополнение к добавлению action="{!updateAnswer}" в ActionSupport выше (или ниже, в зависимости от того, как вы это видите)
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;
}
Вероятно, соответствующий код контроллера
public ProposalExtension(ApexPages.StandardController pCon) {
this.p = (Proposal__c)pCon.getRecord();
}
Решение
Оберните элемент в <apex:outputPanel>
и повторно отрисуйте это, а не тот элемент, который вы хотите отобразить.Проблема в том, что элемента нет на странице, когда он не отрисован, поэтому он не является рабочей целью для повторного рендеринга.
Это то, что часто выводит людей из себя, включая меня самого — Я написал сообщение в блоге об этом здесь: http://www.laceysnr.com/2011/10/using-rerender-to-render-one-solution.html
** РЕДАКТИРОВАТЬ **
Раньше не замечал, что у вас не было действия, указанного в вашем <apex:actionSupport>
метка.Вы можете использовать это для вызова действия на контроллере.Поскольку список выбора записывает нужное вам значение, вам на самом деле не нужно ничего делать в коде (если вы этого не хотите), вы могли бы просто сделать это:
// controller
public Pagereference UpdateAnswer()
{
// do some stuff if you want
return null
}
// page
<apex:actionSupport action="{!UpdateAnswer}" status="StatusChange" event="onchange" rerender="PageErrors, appraiserInfo"/>
Надеюсь, это поможет!