Salesforce/Apex-保存动态复选框数的值
我目前在联系人记录中嵌入了一个Visualforce页面,该页面显示所有活动,并带有一个复选框,指示联系人是否为活动的成员(如果选中,则联系人为成员)。我还有一个保存更改的命令按钮。visualforce代码是使用apex:repeat生成的,如下所示: <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}" />Salesforce/Apex-保存动态复选框数的值,salesforce,apex-code,visualforce,Salesforce,Apex Code,Visualforce,我目前在联系人记录中嵌入了一个Visualforce页面,该页面显示所有活动,并带有一个复选框,指示联系人是否为活动的成员(如果选中,则联系人为成员)。我还有一个保存更改的命令按钮。visualforce代码是使用apex:repeat生成的,如下所示: <apex:repeat value="{!campaignWrappers}" var="cm"> <div class="MailingRow"> <apex:outputText styleCl
整个集合将被发送回服务器(因此所有复选框的状态)。Salesforce和任何其他与web相关的语言之间没有太大区别(例如,请参阅。主要区别在于,通常使用名称以
[]
结尾的变量,SF将使用名称中某处数字递增的唯一名称)
如果你真的想建立2个列表-也许是添加/删除2个隐藏文本字段内容的javascript魔法。。。但这有点乱
当表单将被提交并且调用您的updateChangeList()
时,您可以迭代活动包装器的集合,并与以前的值进行比较。将前一个值存储在包装器中的另一个变量中&不要将其公开给用户,否则根据活动中的内容您仍然可以知道:
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);
}
}
Set-activitystobeadedto=new-Set();
Set-activitystoberemovedfrom=new-Set();
for(活动成员cm:ActivationWrappers){
if(cm.selected&&cm.c.CampaignMembers.isEmpty(){
//是票,但以前不是会员
添加的活动(cm.c.Id);
}如果(!cm.selected&!cm.c.campetingmembers.isEmpty()),则为else{
//未勾选但曾是会员
从添加中删除的活动(cm.c.Id);
}
}
您甚至可以对其进行一些优化(比如将isEmpty()检查放在helper变量中)。或者阅读有关可能产生“副作用”的setter方法的内容。毕竟,当表单数据被反序列化时,您将运行这样的循环。这是一个很好的起点(我知道这很古老。基本上在这篇博文之前,我们必须为我们想在VF中使用的每个变量编写Boolean getSelected()
和void setSelected(Boolan b)
)
最后但并非最不重要的一点-指向的链接。您可以使用联系人对象的包装类来存储联系人的当前和新状态,以检查联系人是否是活动的成员
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;
}
}
使用选中的字段,我们可以识别contact是否是活动的成员,并且包装中的选中的变量有助于识别VF页面中给出的输入。创建ContactWrapper列表,并使用重载构造函数“ContactWrapper(contact c)”初始化每个ContactWrapper对象
最后使用这两个列表更改的ContactList和未更改的ContactList。您可以插入或删除dml
我相信这里没有使用ActionSupport标记,因为所有需要的值都将使用ContactWrapper列表的getter和setter来使用(读/写)
public List<ContactWrapper> wrapper {get;set;}
公共列表包装器{get;set;}
感谢您提供的信息眼霜。我有点困惑。因此,在每个复选框上使用actionSupport并不是前进的方向,相反,我会在commandbutton上设置一个操作,该操作按照上面的示例执行逻辑。我是否需要为每个复选框设置一个ID,以便在控制器中识别它们?我无法在visual Button中设置ID强制:id={!cm.c.id},因为它必须是文字?ActionSupport不是魔杖;)这是一个AJAX快捷方式,可以提交整个表单并执行操作。当用户选中复选框时,将其视为立即单击某个隐藏按钮。关键是这将是一个网络流量。如果您想逐个发送它们,当然可以。您可以,但不必设置id。它们将获得id
和name
set autom不必担心,假设在输入方法体时,所有变量都将被解析等等。对于您来说,准备好使用了谢谢您的详细解释!
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
public List<ContactWrapper> wrapper {get;set;}