代码之家  ›  专栏  ›  技术社区  ›  Ronnie

Salesforce/Apex-保存复选框的动态数量的值

  •  1
  • Ronnie  · 技术社区  · 12 年前

    我目前在联系人记录上嵌入了一个Visualforce页面,该页面显示所有活动的活动,并带有一个复选框,指示该联系人是否为活动成员(如果选中,则该联系人为成员)。我还有一个保存更改的命令按钮。可视化力代码是使用 顶点:重复 像这样:

    <apex:repeat value="{!campaignWrappers}" var="cm">
      <div class="MailingRow">
         <apex:outputText styleClass="CampaignLabel" value="{!cm.c.Name}" ></apex:outputText>
         <apex:inputCheckbox styleClass="CampaignCheck" value="{!cm.selected}" />
      </div>
    </apex:repeat>

    我的问题是,将复选框值传递给控制器的最佳方法是什么?理想情况下,我希望只传递已更改的复选框,传递从选中到未选中的复选框列表,以及包含从未选中到已选中复选框的第二个列表。然后我可以插入和删除这些列表。

    在这种情况下,复选框上是否应该使用actionSupport标记?

    <apex:actionSupport event="onChange" action="{!updateChangeList}" />
    2 回复  |  直到 12 年前
        1
  •  2
  •   kapcsbit    12 年前

    您可以使用联系人对象的Wrapper类来存储联系人的当前和新状态,以检查联系人是否是活动的成员。

    public class ContactWrapper 
    {                 
     public Boolean checked{ get; set; }            
     public Contact con { get; set;}                     
    
     public AccountSKUWrapper()
     {                
       con = new Contact();                
       checked = false;            
     }                     
    
     public ContactWrapper(Contact c)
     {                
       con= c;                
       checked = c.selected;            
     }                               
    

    }

    使用 挑选出来的 字段,我们可以确定联系人是否是Campaign的成员,以及 选中的 包装器中的变量有助于识别VF页面中给出的输入。创建ContactWrapper的列表,并使用重载构造函数“ContactWrappeer(Contact c)”初始化每个ContactWrapper对象。

        <apex:repeat value="<ContactWrapper Object>" var="cm">
      <div class="MailingRow">
         <apex:outputText styleClass="CampaignLabel" value="{!cm.con.Name}" ></apex:outputText>
         <apex:inputCheckbox styleClass="CampaignCheck" value="{!cm.checked}" />
      </div>
    </apex:repeat>
    

    单击保存按钮时,请执行以下步骤:检查与所选字段不同的已检查变量的值。

    Create 2 list **CHANGEDCONTACTLIST** and **UNCHANGEDCONTACTLIST** and then Loop through the list of ContactWrapper
    
    begin loop
    1.If checked differs then load **CHANGEDCONTACTLIST** with Contact Wrapper object as this need to be updated in Contact object; in order to update selected field of contact. 
    
    2.Else load **UNCHANGEDCONTACTLIST**.
    end loop
    

    最终使用这两个列表 变更联系人 不变联系人 。您可以插入或删除dml。

    我认为这里没有使用ActionSupport标记,因为所有需要的值都将使用ContactWrapper列表的getter和setter来使用(读/写)。

    public List<ContactWrapper> wrapper {get;set;}
    
        2
  •  1
  •   Community CDub    8 年前

    整个集合将被发送回服务器(所有复选框的状态也是如此)。Salesforce和任何其他与网络相关的语言之间没有太大区别(请参阅 Get $_POST from multiple checkboxes 例如主要区别在于,通常使用名称以结尾的变量 [] 并且SF将使用在名称中某处具有递增数字的唯一名称)。

    如果你真的想构建2个列表——也许是添加/删除2个隐藏文本字段内容的javascript魔法。。。但那有点乱。

    何时提交表格以及您的 updateChangeList() 调用时,您可以迭代CampaignWrappers的集合并与以前的值进行比较。要么将前面的值存储在包装器中的1个变量中&不要将其暴露给用户,否则您仍然会根据活动中的内容知道:

    Set<Id> campaignsToBeAddedTo = new Set<Id>();
    Set<Id> campaignsToBeRemovedFrom = new Set<Id>();
    
    for(CampaignMember cm : campaignWrappers){
       if(cm.selected && cm.c.CampaignMembers.isEmpty(){
          // is ticket but wasn't a member before
          campaignsToBeAddedTo.add(cm.c.Id);
       } else if (!cm.selected && !cm.c.CampaignMembers.isEmpty()){
          // not ticked but used to be a member
          campaignsToBeRemovedFrom.add(cm.c.Id);
       }
    }
    

    您甚至可以对它进行一些优化(比如将isEmpty()检查放在辅助变量中)。或者阅读关于可能产生“副作用”的setter方法。毕竟,当表单数据被反序列化时,这样的循环无论如何都会为您运行。 http://blogs.developerforce.com/developer-relations/2008/06/property-access.html 是一个很好的起点(我知道这很古老。基本上在我们写这篇博客之前 Boolean getSelected() void setSelected(Boolan b) 对于我们想要在VF中使用的每个变量)。

    最后但并非最不重要的一个链接 page execution order .