这里用的组合是:apex:commandLink  + apex:actionFunction + apex:outputPanel

这里的 apex:commandLink 和 apex:actionFunction 都可以通过 action 来指定Ajax所回调的后台方法,

方案一:

其中 apex:commandLink 充当直接回调后台方法的控件,  用 oncomplete 指定执行完后台方法之后所调用的 actionFunction

其中 apex:actionFunction 的 name 标识actionFunction的名字,实质上是一个JavaScript方法,其他地方可以直接进行调用,这里用apex:commandLink的oncomplete方法调用, rerender 指定所要刷新的 apex:outputPanel, oncomplete 指定刷新完outputPanel之后所调用的JavaScript方法

1):后台class的变量和类定义

public List<SalesPersonSales> personSalesTop10_MTD { get; set; }

public class SalesPersonSales implements Comparable{
public string OwnerName {get;set;}
public string OwnerId {get;set;}
public decimal TotalSales {get;set;}
public decimal TotalGP {get;set;} public SalesPersonSales(string name, string id, decimal sales, decimal gp){
OwnerName = name;
OwnerId = id;
TotalSales = sales;
TotalGP = gp;
} public Integer compareTo(Object objToCompare){
return (((SalesPersonSales)objToCompare).TotalSales - TotalSales).intValue();
}
}

2):前台page的控件布局与JavaScript方法

<apex:form id="theform">
<apex:outputPanel id="SalespeopleReportPanel">
<apex:outputPanel id="SalespeopleReportMTDPanel">
<table>
<thead>
<tr>
<th>Top 10 Salespeople MTD</th>
<th>Sales</th>
<th>GP$</th>
</tr>
</thead>
<tbody>
<apex:repeat value="{!personSalesTop10_MTD}" var="Item_Obj">
<tr>
<td>
<apex:outputLink value="../apex/DashboardReportDetail">
{!Item_Obj.OwnerName}
<apex:param name="oid" value="{!Item_Obj.OwnerId}"/>
<apex:param name="timetype" value="MTD"/>
</apex:outputLink>
</td>
<td>
<apex:outputText value="{0,number,$#,###.##}" >
<apex:param value="{!Item_Obj.TotalSales}" />
</apex:outputText>
</td>
<td>
<apex:outputText value="{0,number,$#,###.##}" >
<apex:param value="{!Item_Obj.TotalGP}" />
</apex:outputText>
</td>
</tr>
</apex:repeat>
<tr>
<td>
<apex:commandLink action="{!LoadAllSalespeople}" oncomplete="rerenderSalespeopleReportMTDPanel();" status="sstatus">
Show All
<apex:param value="All" name="topType"/>
<apex:param value="MTD" name="timeType"/>
</apex:commandLink>
</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</apex:outputPanel>
<apex:actionFunction name="rerenderSalespeopleReportMTDPanel" rerender="SalespeopleReportMTDPanel" oncomplete="refreshSalespeopleDashboardChart();"/>
</apex:outputPanel>
</apex:form> <script type="text/javascript"> function refreshSalespeopleDashboardChart(){
// Your JS function....
} </script>

【 注:如果Ajax回调的方法更新了后台的某个变量,前台JS方法中想要直接用{!myVariable}这种方法是获取不到更新之后的值的,这样的处理方式细想一下还是很合理的。】

【 要想获取更新之后的值的话,要将变量的值存储到更新的outputPanel中的某个控件中,然后通过JS的方法获取更新之后控件的内容就可以了。】

3):Ajax回调的后台方法

public pagereference LoadAllSalespeople(){
string topType = ApexPages.currentPage().getParameters().get('topType');
string timeType = ApexPages.currentPage().getParameters().get('timeType');
if(timeType == 'MTD'){
// to do
}
else{
// to do
}
return null;
}

上面的这种方式有一个很大的弊端,就是不能够动态的给parameter赋值,如果想满足这点请看如下方案

方案二:

其中 apex:commandLink 仅当做一个触发器,通过前台JS方法去调用apex:actionFunction所对应的后台方法,这个JS方法做了一个非常重要的事情就是动态的传递Parameter的值。形式为:actionFunction的名字(param1, param2, ...)

其中 apex:actionFunction 的 name 标识actionFunction的名字,实质上是一个JavaScript方法,其他地方可以直接进行调用,rerender 指定所要刷新的 apex:outputPanel, oncomplete 指定刷新完outputPanel之后所调用的JavaScript方法

那么所对应的Apex Page代码如下所示:

<apex:form id="theform">
<apex:outputPanel id="SalespeopleReportPanel">
<apex:outputPanel id="SalespeopleReportMTDPanel">
<table>
<thead>
<tr>
<th>Top 10 Salespeople MTD</th>
<th>Sales</th>
<th>GP$</th>
</tr>
</thead>
<tbody>
<apex:repeat value="{!personSalesTop10_MTD}" var="Item_Obj">
<tr>
<td>
<apex:outputLink value="../apex/DashboardReportDetail">
{!Item_Obj.OwnerName}
<apex:param name="oid" value="{!Item_Obj.OwnerId}"/>
<apex:param name="timetype" value="MTD"/>
</apex:outputLink>
</td>
<td>
<apex:outputText value="{0,number,$#,###.##}" >
<apex:param value="{!Item_Obj.TotalSales}" />
</apex:outputText>
</td>
<td>
<apex:outputText value="{0,number,$#,###.##}" >
<apex:param value="{!Item_Obj.TotalGP}" />
</apex:outputText>
</td>
</tr>
</apex:repeat>
<tr>
<td>
<apex:commandLink onclick="CallActionFunction();">Show All</apex:commandLink>
</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</apex:outputPanel>
<apex:actionFunction name="rerenderSalespeopleReportMTDPanel" action="{!LoadAllSalespeople}" rerender="SalespeopleReportMTDPanel" oncomplete="refreshSalespeopleDashboardChart();"/>
<apex:param value="All" name=""/>
<apex:param value="MTD" name=""/>
</apex:actionFunction>
</apex:outputPanel>
</apex:form> <script type="text/javascript"> function CallActionFunction(){
rerenderSalespeopleReportMTDPanel('topType', 'timeType'); // these two parameters can get automatically by js
} function refreshSalespeopleDashboardChart(){
// Your JS function....
} </script>

对比方案一和方案二:

方案一的基本代码结构(轻actionFunction,重commandLink)

<apex:outputPanel id="SalespeopleReportMTDPanel">
<apex:commandLink action="{!LoadAllSalespeople}" oncomplete="rerenderSalespeopleReportMTDPanel();">
Show All
<apex:param value="All" name="topType"/>
<apex:param value="MTD" name="timeType"/>
</apex:commandLink>
<apex:actionFunction name="rerenderSalespeopleReportMTDPanel" rerender="SalespeopleReportMTDPanel" oncomplete="refreshSalespeopleDashboardChart();"/>
</apex:outputPanel> <script type="text/javascript"> function refreshSalespeopleDashboardChart(){
// Your JS function....
} </script>

方案二的基本代码结构(轻commandLink,重actionFunction)

<apex:outputPanel id="SalespeopleReportMTDPanel">
<apex:commandLink onclick="CallActionFunction();">Show All</apex:commandLink>
<apex:actionFunction name="rerenderSalespeopleReportMTDPanel" action="{!LoadAllSalespeople}" rerender="SalespeopleReportMTDPanel" oncomplete="refreshSalespeopleDashboardChart();"/>
<apex:param value="All" name=""/>
<apex:param value="MTD" name=""/>
</apex:actionFunction>
</apex:outputPanel> <script type="text/javascript"> function CallActionFunction(){
rerenderSalespeopleReportMTDPanel('topType', 'timeType'); // these two parameters can get automatically by js
} function refreshSalespeopleDashboardChart(){
// Your JS function....
} </script>

进一步引申:

我们发现可以完全用其他控件来代替commandLink的触发器作用,来调用actionFunction所指定的后台方法,具体的代码结构如下所示:

<apex:outputPanel id="SalespeopleReportMTDPanel">
<input type="button" value="Show All" title="ShowAll" name="ShowAll" onclick="CallActionFunction();"/>
<apex:actionFunction name="rerenderSalespeopleReportMTDPanel" action="{!LoadAllSalespeople}" rerender="SalespeopleReportMTDPanel" oncomplete="refreshSalespeopleDashboardChart();"/>
<apex:param value="All" name=""/>
<apex:param value="MTD" name=""/>
</apex:actionFunction>
</apex:outputPanel> <script type="text/javascript"> function CallActionFunction(){
// other custom logic
rerenderSalespeopleReportMTDPanel('topType', 'timeType'); // these two parameters can get automatically by js
} function refreshSalespeopleDashboardChart(){
// Your JS function....
} </script>

这里附上另一种Ajax回调的方式,请看这个链接:http://www.cnblogs.com/mingmingruyuedlut/p/3385532.html

在Visualforce page中用自带的控件实现Ajax回调后台方法(并且可以用js去动态给parameters赋值)的更多相关文章

  1. 在Asp.Net MVC中用Ajax回调后台方法

    在Asp.Net MVC中用Ajax回调后台方法基本格式: var operData = ...; //传递的参数(action中定义的) var type = ...; //传递的参数(action ...

  2. silverlight visifire控件图表制作——silverlight 后台方法页面事件

    1.返回事件 (1.返回silverlight页面,2.返回web页面) private void button_ClickBack(object sender, RoutedEventArgs e) ...

  3. silverlight visifire控件图表制作——silverlight 后台方法ControlChart.xaml.cs

    一.构造方法ControlChart 1.前台页面控件赋值 //时间下拉框赋值,下拉框赋选定值                for (int ii = DateTime.Today.Year; ii ...

  4. silverlight visifire控件图表制作——silverlight 后台方法画图

    1.调用wcf 获取信息 private void svc_GetSingleChartDataCompleted(object sender, GetSingleChartDataCompleted ...

  5. silverlight visifire控件图表制作——silverlight 后台方法打印

    一.后台方法 1.添加引用:using System.Windows.Printing; 2.全局变量://定义图片和文本打印变量  PrintDocument printImage; 3.构造方法体 ...

  6. 【转】【完全开源】百度地图Web service API C#.NET版,带地图显示控件、导航控件、POI查找控件

    [转][完全开源]百度地图Web service API C#.NET版,带地图显示控件.导航控件.POI查找控件 目录 概述 功能 如何使用 参考帮助 概述 源代码主要包含三个项目,BMap.NET ...

  7. HighChats图表控件显示精度小数点的方法

    相信大家对highchats这个图表控件并不陌生,最近在项目中用到它,但是某些字段需要显示为小数点,顾查找资料文档发现下面两个方式可以实现: 初始化时候添加如下两个参数 tooltip:{    fo ...

  8. C#自动实现Dll(OCX)控件注册的两种方法

    尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写.当需要用到Dll引用的时候,我们通常会通 ...

  9. C#中DEV控件,XtraTabPage得小方法

    DEV控件设计窗体程序,XtraTabPage用到的小方法,欢迎大家评论,分享技术! //DEV中的选项卡 private bool TabCtlPageExist(string pageName) ...

随机推荐

  1. 第七天 面向对象进阶与socket编程

    1.静态方法(用得少)(解除某个函数跟类的关联,加了静态方法后,类便不能将类的参数传给静态方法函数了) class Dog(object): def __init__(self,name): @sta ...

  2. winserver2008 Oracle 11g 安装

    .在Windows Server2008R2上安装Oracle Database 11g Release 2,下载64位的安装程序,地址: 文件1:http://download.oracle.com ...

  3. Linux下如何移除同时在线的用户

    Linux下移除同时在线的用户太多时,shell操作会变得比较卡,很多时候经常是直接关闭终端导致不正常退出,一般要等上一段时间才会退出,这个时候主动结束用户进程使用户下线是比较好的方式,方法如下: 使 ...

  4. MySQL(MariaDB)的 SSL 加密复制

    背景: 在默认的主从复制过程或远程连接到MySQL/MariaDB所有的链接通信中的数据都是明文的,在局域网内连接倒问题不大:要是在外网里访问数据或则复制,则安全隐患会被放大很多.由于项目要求需要直接 ...

  5. MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】

    概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布 ...

  6. winrt组件库(包括翻书组件)

    http://www.mindscapehq.com/products/metroelements/controls/book-control-for-winrt 点击“down free trial ...

  7. NHibernate实战详解(一)领域模型设计

    关于NHibernate的资料本身就不多,中文的就更少了,好在有一些翻译文章含金量很高,另外NHibernate与Hibernate的使用方式可谓神似,所以也有不少经验可以去参考Hibernate. ...

  8. db2中报SQLCODE=-530, SQLSTATE=23503错误

    今天在写一个增加操作时,报错信息如下:SQLCODE=-530, SQLSTATE=23503,该sqlcode说明:“对特定的约束名指定了无效的外健值”. 项目中用的框架是SSH,新增的主对象有多个 ...

  9. java课后作业 弹出窗口求两个数的加减乘除

    //计算2个数的加减乘除 谷伟华 2015/10/6package jisuan; import javax.swing.JOptionPane; public class Jiasuan { pub ...

  10. eclipse 中添加工程 Some projects cannot be imported because they already exist in the workspace

    第一次从外部文件导入HelloWorld工程到workspace目录中,成功. 删除后,再次从外部导入workspace目录提示 Some projects cannot be imported be ...