2013-06-08 3 views
1

inputCheckbox et commandLink/commandButton ne peuvent pas fonctionner ensemble !!Comportement étrange (bug) de inputCheckbox dans le visualforce

Cas 1:

Essayez les codes.

L'action Visualforce dans celle-ci ne peut pas fonctionner.

<apex:commandLink action="{!SelectTicket}" reRender="outputPanel"> 
     <apex:inputCheckbox value="{!ordsOptions[o]}"/> 
     <apex:param name="selected" value="{!o.id}" assignTo="{!selected}"/> 
    </apex:commandLink> 

Sans

value="{!ordsOptions[o]}"
dans le inputCheckbox. Le code presque identique fonctionne bien.

<apex:commandLink action="{!SelectTicket}" reRender="outputPanel"> 
     <apex:inputCheckbox/> 
     <apex:param name="selected" value="{!o.id}" assignTo="{!selected}"/> 
    </apex:commandLink> 

Cas n ° 2:

Il ne se déclenche pas l'action du tout quand ajoutez le inputCheckbox dans une autre colonne.

<apex:dataTable border="4" value="{!ords}" var="o"> 
     <apex:column > 
      <apex:commandLink action="{!SelectTicket}" reRender="outputPanel"> 
       <apex:inputCheckbox /> 
       <apex:param name="selected" value="{!o.id}" assignTo="{!selected}"/> 
      </apex:commandLink> 
     </apex:column> 
     <apex:column ><apex:inputCheckbox value="{!ordsOptions[o]}"/></apex:column> 
     <apex:column ><apex:outputText value="{!ordsOptions[o]}"/></apex:column> 
     <apex:column value="{!o.Id}"/> 
     <apex:column value="{!o.Name}"/> 
    </apex:dataTable> 

Il fonctionne très bien sans inputCheckbox avec commandLink:

<apex:dataTable border="4" value="{!ords}" var="o"> 
     <apex:column > 
      <apex:commandLink action="{!SelectTicket}" reRender="outputPanel"> 
       <apex:inputCheckbox /> 
       <apex:param name="selected" value="{!o.id}" assignTo="{!selected}"/> 
      </apex:commandLink> 
     </apex:column> 
     &lt;-- <apex:column ><apex:inputCheckbox value="{!ordsOptions[o]}"/></apex:column> --&gt; 
     <apex:column ><apex:outputText value="{!ordsOptions[o]}"/></apex:column> 
     <apex:column value="{!o.Id}"/> 
     <apex:column value="{!o.Name}"/> 
    </apex:dataTable> 

Les codes entiers

vf:

<apex:page controller="SelectRadio" sidebar="false"> 
    <apex:outputPanel id="outputPanel"> 
    <apex:form > 
     <apex:dataTable border="4" value="{!ords}" var="o"> 
      <apex:column > 
       <apex:commandLink action="{!SelectTicket}" reRender="outputPanel"> 
        <apex:inputCheckbox /> 
        <apex:param name="selected" value="{!o.id}" assignTo="{!selected}"/> 
       </apex:commandLink> 
      </apex:column> 
      <apex:column ><apex:inputCheckbox value="{!ordsOptions[o]}"/></apex:column> 
      <apex:column ><apex:outputText value="{!ordsOptions[o]}"/></apex:column> 
      <apex:column value="{!o.Id}"/> 
      <apex:column value="{!o.Name}"/> 
     </apex:dataTable> 
     <apex:commandButton action="{!rSfdc}" value="按鍵"/> 
    </apex:form> 
    <hr/> 
    <h1>Debug</h1> 
     <p>ordsOptions = {!ordsOptions}</p> 
     <p>ordsOptionName = {!ordsOptionName}</p> 
     <p>selected = {!selected}</p> 
    </apex:outputPanel> 
</apex:page> 

Classe:

public with sharing class SelectRadio { 

    public List<String> vars {get;set;} 
    public List<Custom_Object__c> ords {get; set;} 
    public Map<Id,Boolean> ordsOptions {get; set;} 
    public Map<Id,String> ordsOptionName {get; set;} 
    public Id selected {get;set;} 

    public SelectRadio(){ 
     ordsOptions = new Map<Id,Boolean>(); 
     ordsOptionName = new Map<Id,String>(); 
     ords = [ SELECT Id, Name FROM Custom_Object__c ORDER BY Name ]; 
     for (Custom_Object__c tmp : ords) { 
      ordsOptions.put(tmp.Id, false); 
      ordsOptionName.put(tmp.Id, tmp.Name); 
     } 
    } 

    public pageReference SelectTicket() { 
     for(Custom_Object__c tmp : ords) if(tmp.Id == selected) ordsOptions.put(tmp.Id, true); else ordsOptions.put(tmp.Id, false); 
     return null; 
    } 

    public PageReference rSfdc() { 
     PageReference rp = new PageReference('http://www.salesforce.com'); 
     rp.setRedirect(true); 
     return rp; 
    } 
} 

Répondre

0

Ce n'est pas un bug du tout. Et, ça doit être ainsi.

Tout tourne autour de la logique de la programmation OO.

Enfin, je me suis trouvé la réponse.

Vérifiez la réponse ici: http://boards.developerforce.com/t5/Visualforce-Development/Strange-Bug-of-the-apex-inputCheckbox/m-p/631629/highlight/false#M65163

Il peut être utilisé pour remplacer le selectRadio et le code de modèle est plus flexible que le sommet: selectRadio. Le modèle d'échantillon est facile à utiliser avec apex: dataTable et apex: repeat. C'est la raison pour écrire le code. Profitez-en avec moi si vous aimez.