Ajax Toolkit 参考文档:https://resources.docs.salesforce.com/212/latest/en-us/sfdc/pdf/apex_ajax.pdf

在项目中,我们有时会在自定义button或者action上使用javascript进行一些SOQL或者DML操作处理;有时会在VF页面中获取相关数据进行逻辑处理,或者进行简单的DML操作,这时候就会使用到Ajax Toolkit。

因为Ajax Toolkit操作数据信息是在浏览器端的,进行复杂的逻辑或者对大量数据处理会影响前端的性能,所以不是所有的场景都适合使用ajax toolkit。可以在以下情景(不仅限于以下)下使用:

  • 展示或者更新单条数据
  • 在一些数据中展示一两列信息
  • 执行简单的业务逻辑

因为使用在浏览器端,所以保证数据量越少,业务逻辑越少,是最好的。以下从两个方面进行Ajax Toolkit介绍:VF / JavaScript Action

Ajax Toolkit 可以分成三步走:链接Ajax Toolkit API,嵌入API Call,对结果进行处理。接下来会将后两步揉成一步进行处理。

一.链接到Ajax Toolkit API

VF:在页面中引入js,其中42.0代表version,这个值代表着当前connection.js的版本号。你也可以设置成41.0,40.0等等。

<script src="../../soap/ajax/42.0/connection.js" type="text/javascript"></script>
<script>
sforce.connection.sessionId='{!GETSESSIONID()}';
//TODO
</script>

onclick javascript:引用{!requireScript("/soap/ajax/42.0/connection.js")}

当引入的javascript执行后,toolkit便会被加载并创建了一个全局的对象sforce.connection,你可以通过这个对象访问所有的API call以及ajax toolkit toolkit的方法。toolkit支持所有的SOAP API calls.

可用的核心API介绍链接:https://developer.salesforce.com/docs/atlas.en-us.212.0.api.meta/api/sforce_api_calls_list.htm

二.在javascript中嵌入API Call并进行结果处理

Ajax Toolkit 支持同步和异步两种调用。

同步调用和异步调用的区别为:同步调用为当向服务器端发送请求后,需要一直等到服务器端返回结果,并针对结果进行后期的处理;异步调用为当向服务器发送请求后,可以继续进行其他的处理,当服务器有调用返回结果后,再进行结果处理。异步调用需要在API call中添加一个参数用来做call back的函数处理。

同步调用格式:
sforce.connection.method("argument1","argument2",...);

异步调用格式:
sforce.connection.method("argument1","argument2",...,"callback_function");

因为调用有可能出现异常,同步和异步的异常处理如下:
同步异常处理为在调用处使用try catch 来捕获异常

异步异常处理为异步的callback result提供了一个onFailure配置,当出现异常后,会执行onFailure配置的方法,成功会执行onsuccess方法
因为异步调用为结果什么时候返回,客户端什么时候处理,当后台处理特别慢的情况下,前端等待时间太长会很不友好,异步调用提供了一个timeout配置属性,用来设置异步调用最长时间,单位是以毫秒为单位,最小值为1
完整异步调用格式
var callback = {onSuccess: handleSuccess, onFailure: handleFailure,timeout:1000};
function handleSuccess(result) {}
function handleFailure(error) {}
sforce.connection.query("Select name from Account", callback);

ajax toolkit call 不论当前搜索的数据字段在表结构中是什么类型,使用ajax toolkit query返回的数据类型均为string类型,如果搜索的字段在数据库中存储的value为null,则获取到的值为null,如果当前没有搜索此字段,但是在前台js中有引用到,则值为undefined.

除了针对数据的CRUD外,ajax toolkit 还支持很多操作,比如 提交审批 / 通过Schema获取sObject以及Field的相关元数据信息 / 发送邮件等功能

同步调用举例:

https://developer.salesforce.com/docs/atlas.en-us.ajax.meta/ajax/sforce_api_ajax_more_samples.htm

异步调用举例:

https://developer.salesforce.com/docs/atlas.en-us.ajax.meta/ajax/sforce_api_ajax_more_samples_asynch.htm

我们有时还需要调用相关类的方法。如果需要调用apex 相关类的方法,需要引入apex.js

VF写法:<script src="/soap/ajax/41.0/apex.js" type="text/javascript"></script>

action写法:{!requireScript("/soap/ajax/41.0/apex.js")}

调用的类的方法必须声明称webservice,方法的参数需要为 基本数据类型,sObject类型或者是两者数据类型的List

js端调用结构为(如果有结果返回,则接收;如果无结果返回,则不需要接收)

var result = sforce.apex.execute("className","methodName","{param1Key:param1Value,param2Key:param2Value}");

如果调用的方法没有参数,则调用结构为

var reuslt = sforce.apex.execute("className","methodName","{}");

三.举例

需求:客户上面有多个联系人,如果没有选择联系人,则提示需要选择至少一个联系人。选择的联系人要求联系人的邮箱必须都不能为空。点击按钮后更新联系人Is_Checked__c设置为true。

1.Contact上创建字段Is_Checked__c

2.创建webservice类,参数为ContactList,将参数中所有的Contact的Is_Checked__c更新为true

global without sharing class ContactController {

    static webservice Boolean changeContactsStatus(List<Contact> contactList) {
List<Contact> updateContactList = new List<Contact>();
for(Contact c : contactList) {
Contact tempContact = new Contact();
tempContact.Id = c.Id;
tempContact.Is_Checked__c = true;
updateContactList.add(tempContact);
}
try {
if(updateContactList.size() > 0) {
update updateContactList;
}
return true;
} catch(Exception e) {
return false;
}
}
}

3.Contact创建custom action,设置类型为List Button,勾选Display Checkboxes,Behavor选择为execute javascript

对应的javascript代码如下(函数描述:https://help.salesforce.com/articleView?err=1&id=customize_functions.htm&type=5

{!requireScript("/soap/ajax/41.0/connection.js")}
{!requireScript("/soap/ajax/41.0/apex.js")}
var selectedIds = {!GETRECORDIDS($ObjectType.Contact)};
var contactIds = '';
if(selectedIds.length == 0) {
alert('You have to choose at least one item');
} else {
selectedIds.forEach(function(item,index){
contactIds += '\'' + item + '\'';
if(index != selectedIds.length-1) {
contactIds += ',';
}
}); var contactQuery = "SELECT ID,Name,Email,LastModifiedDate,CreatedDate FROM Contact WHERE ID in (" + contactIds + ")";
result = sforce.connection.query(contactQuery);
records = result.getArray("records");
var isSuccess = true;
records.forEach(function(item,index){
if(item.Email == null || item.Email == '') {
isSuccess = false;
}
})
if(isSuccess) {
var executeResult = sforce.apex.execute("ContactController","changeContactsStatus",{contactList:records});
if(executeResult) {
alert('Operate Success!');
} else {
alert('Operate Failed!');
}
} else {
alert('The Items you selected have empty email.please check it again');
} }

4.将Test Action设置在Account的Related List(Contact List)设置

效果展示:

1.不选情况下

2.正常操作

总结:针对Ajax Toolkit,如果数据量不多并且需要在前台处理情况下,可以考虑使用此种方式。不过lightning不支持action使用javascript,所以此种方式只支持classic的action 方式的javascript。

salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)的更多相关文章

  1. salesforce 零基础学习(十六)Validation Rules & Date/time

    上一篇介绍的内容为Formula,其中的Date/time部分未指出,此篇主要介绍Date/time部分以及Validation rules. 本篇参考PDF: Date/time:https://r ...

  2. salesforce零基础学习(九十六)Platform Event浅谈

    本篇参考:https://developer.salesforce.com/blogs/2018/07/which-streaming-event-do-i-use.html https://trai ...

  3. salesforce零基础学习(九十六)项目中的零碎知识点小总结(四)

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.216.0.apexcode.meta/apexcode/apex_classes_ke ...

  4. salesforce 零基础学习(十八)WorkFlow介绍及用法

    说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配置workflow来完成以上 ...

  5. salesforce 零基础学习(十九)Permission sets 讲解及设置

    Permission sets以及Profile是常见的设置访问权限的方式. Profile规则为'who see what'.通过Profile可以将一类的用户设置相同的访问权限.对于有着相同Pro ...

  6. salesforce零基础学习(一百零五)Change Data Capture

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.232.0.api_streaming.meta/api_streaming/using ...

  7. salesforce 零基础学习(六十八)http callout test class写法

    此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...

  8. salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现

    项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...

  9. salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见

    项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...

随机推荐

  1. c++只能编译无法运行或许缺少命令

    -mwindows -lcomctl32 -lwinmm -lws2_32 -lodbc32 -lmysql   -lwinspool1.工具-编译选项-编译器-在连接器命令行加入以下命令:-mwin ...

  2. callback和spring的MD5加密

    举个例子:当我们访问淘宝网站的时候,当点击购物车的时候,这个时候提示用户登录用户名和密码,登录成功后,会返回到购物车的页面.这就是回调. 它不返回淘宝的首页,而是返回到我们点击的内容所在页面. 在写接 ...

  3. Spark学习笔记2(spark所需环境配置

    Spark学习笔记2 配置spark所需环境 1.首先先把本地的maven的压缩包解压到本地文件夹中,安装好本地的maven客户端程序,版本没有什么要求 不需要最新版的maven客户端. 解压完成之后 ...

  4. 网站搭建中,怎么区分ASP和PHP

    1:空间支持上 ASP:程序要求比较低,空间只要支持ASP+access即可运行 PHP:配置要求比较高,空间需要支持PHP及数据库,而且程序和数据库是单独的,一般的 unix空间都是这种配置. 2: ...

  5. php数组根据某一个键值,把相同键值的合并生成一个新的二维数组

    http://blog.csdn.net/xyzchenxiaolin/article/details/51700485 源数据: $infos = array( array( 'a' => 3 ...

  6. 【编程技巧】ExtJs 设置GridPanel表格文本垂直居中

    详细讲解见 http://blog.csdn.net/li396864285/article/details/9310983 以下是我改修的代码: {         width:90,        ...

  7. Java读写Excel之POI超入门(转)

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.Apache POI ...

  8. 动态添加div及对应的js、css文件

    动态添加div及对应的js.css文件 在近期的项目开发中需要在首页中添加很多面板型的div,直接加载代码显得很繁琐,于是利用js封装一个动态添加div及其对应css文件和js文件的方法供大家参考使用 ...

  9. WinForm中,设置不显示窗口的标题栏

    1:ControlBox设置False,然后标题为""的时候标题就不显示了2:把窗体设置为无边的窗体 FormBoderStyle 设为 None  (在Mdi中,关闭按钮会还在) ...

  10. python 函数返回多个参数的赋值方法

    #定义函数 def Get_Counter_AllMeasureValue(self, inst_dg_address): """ get all measure val ...