2013-09-26 3 views
1

Прямо сейчас ошибка, которую я получаю, поле Неверное проверено для sObject People_Language__c.Salesforce - использование jQuery для удаления строк таблицы с помощью флажка

Не уверен, что это не нравится использование класса-оболочки или что-то, но я не вижу проблемы.

Вот контроллер

public with sharing class myClass { 

    public String pId         {get; set;} 
    public list<Wrapper>pLanguages      {get; set;} 




    //CONSTRUCTOR 
    public myClass(){ 
     pId = ApexPages.CurrentPage().getparameters().get('id'); 

     pLanguages = new List<Wrapper>(); 
      for (People_Language__c pl : [SELECT Id, Language__c, Fluency__c FROM People_Language__c WHERE Person__c=:pId]) { 
       pLanguages.add(new Wrapper(pl)); 
      } 
    } 


public void deleteLanguage(){ 
    List<People_Language__c> langsToDelete = new List<People_Language__c>(); 
    for (Integer i = 0; i < pLanguages.size(); i++) { 
     if (pLanguages[i].checked) { 
      langsToDelete.add(pLanguages.remove(i--).pl); 
     } 
    } 
    delete langsToDelete; 
} 

    //WRAPPER 
    public class Wrapper { 
     public boolean checked {get; set;} 
     public People_Language__c pl {get; set;} 
    public Wrapper(People_Language__c pl) { 
     this.pl = pl; 
     this.checked = false; 
    } 
} 
} 

Visualforce

<apex:pageBlock title="Language" id="language"> 
    <apex:inputHidden id="delLanguage" value="{!languagesToDelete}"></apex:inputHidden> 
    <apex:pageBlockButtons location="top">  
     <apex:commandButton id="langNewBtn" value="{!$Label.New}" /> 
     <apex:commandButton id="LangDel" value="{!$Label.del2}" action="{!deleteLanguage}" rerender="language"/> 
    </apex:pageBlockButtons> 
    <apex:pageBlockTable value="{!pLanguages}" var="lang" title="People Language"> 
     <apex:column width = "25px"> 
      <apex:inputCheckbox value="{!lang.checked}" /> 
     </apex:column> 
     <apex:column styleClass="actionColumn" width = "25px"> 
      <apex:facet name="header"> <apex:outputText value="Action" /> </apex:facet> 
      <apex:outputLink styleClass="actionLink" target="_top">Del</apex:outputLink> 
     </apex:column> 
     <apex:column > 
      <apex:facet name="header"> <apex:outputText value="Language" /> </apex:facet> 
      <apex:outputField value="{!lang.pl.Language__c}" /> 
     </apex:column> 
     <apex:column > 
      <apex:facet name="header"> <apex:outputText value="Fluency" /> </apex:facet> 
      <apex:outputField value="{!lang.pl.Fluency__c}" /> 
     </apex:column> 
    </apex:pageBlockTable> 
</apex:pageBlock> 

ответ

1

JQuery может быть полезно, если вы хотите, чтобы шкурой строки из страницы, но на самом деле удаление им необходимо будет управляемый вашим контроллером Apex. Вероятно, самый простой способ сделать это - использовать в контроллере wrapper class, а затем ваш метод deleteLanguage() сможет прокручивать и удалять любые записи, где был установлен флажок. Для этого подхода jQuery не требуется.

Простой контроллер Apex, используя этот подход:

public with sharing class PeopleLanguagesController { 
    public String pId {get; set;} 
    public List<Wrapper> pLanguages {get; set;} 

    //CONSTRUCTOR 
    public PeopleLanguagesController() { 
     pId = ApexPages.CurrentPage().getparameters().get('id'); 
     pLanguages = new List<Wrapper>(); 
     for (People_Language__c pl : [SELECT Id, Language__c, Fluency__c FROM People_Language__c WHERE Person__c = :pId]) { 
      pLanguages.add(new Wrapper(pl)); 
     } 
    } 

    public PageReference deleteLanguage() { 
     List<People_Language__c> langsToDelete = new List<People_Language__c>(); 
     for (Integer i = 0; i < pLanguages.size(); i++) { 
      if (pLanguages[i].checked) { 
       langsToDelete.add((pLanguages.remove(i--)).pl); 
      } 
     } 
     delete langsToDelete; 
     return null; 
    } 

    //WRAPPER 
    public class Wrapper { 
     public boolean checked {get; set;} 
     public People_Language__c pl {get; set;} 
     public Wrapper(People_Language__c pl) { 
      this.pl = pl; 
      this.checked = false; 
     } 
    } 
} 

И тогда ваш VF разметка становится:

<apex:page controller="PeopleLanguagesController"> 
    <apex:form> 
    <apex:pageBlock title="Language" id="language"> 
     <apex:pageBlockButtons location="top"> 
      <!--<apex:commandButton id="langNewBtn" value="{!$Label.New}" />--> 
      <apex:commandButton id="LangDel" value="Delete Languages" action="{!deleteLanguage}" rerender="language"/> 
     </apex:pageBlockButtons> 
     <apex:pageBlockTable value="{!pLanguages}" var="lang" title="People Language"> 
      <apex:column width = "25px"> 
       <apex:inputCheckbox value="{!lang.checked}" /> 
      </apex:column> 
      <apex:column styleClass="actionColumn" width = "25px"> 
       <apex:facet name="header"> <apex:outputText value="Action" /> </apex:facet> 
       <apex:outputLink styleClass="actionLink" target="_top">Del</apex:outputLink> 
      </apex:column> 
      <apex:column > 
       <apex:facet name="header"> <apex:outputText value="Language" /> </apex:facet> 
       <apex:outputField value="{!lang.pl.Language__c}" /> 
      </apex:column> 
      <apex:column > 
       <apex:facet name="header"> <apex:outputText value="Fluency" /> </apex:facet> 
       <apex:outputField value="{!lang.pl.Fluency__c}" /> 
      </apex:column> 
     </apex:pageBlockTable> 
    </apex:pageBlock> 
    </apex:form> 
</apex:page> 

Отказ от ответственности: ни одно из этого кода не было проверено, это только у меня метание пример вместе в Notepad ++. Надеюсь, это ставит вас на правильный путь!

Обновление: Хорошо, я собрал модель данных, подобную вашей, и обновленный код компилируется и, по-видимому, функционирует по назначению. Вы не должны получать ошибку Invalid field checked for sObject People_Language__c на странице VF, потому что это поле является частью оболочки - убедитесь, что у вас есть {!lang.checked} в качестве значения тега apex:inputCheckbox, а не {!lang.pl.checked}.

+0

langsToDelete.add (pLanguages.remove (i--)); Дает несовместимую оболочку ошибок типов для People_language__c –

+0

Обновлен мой ответ, дайте это сейчас. – JCD

+0

Теперь я получаю недопустимое поле «checked» для sObject People_Language__c. Я застрял на этом больше дня. –