JavaScript Remoting 是什么?
JavaScript Remoting 是一个可以用来做异步处理的工具,开发者可以用它从 Visualforce page 到 Apex controller 做 AJAX 请求。JavaScript remoting 允许做异步事件处理的时候,而不需要加载整个页面。
另外,使用 JavaScript remoting 还能帮助我们减轻 view state 的问题。
什么时候使用 JavaScript Remoting
在 mobile 页面和页面上用第三方 JavaScript 库的时候优先考虑 JavaScript remoting。它可以使页面操作起来更具有动态的、交互式的响应。
JavaScript Remoting Example
接下来我们做一个基本的例子,怎样在 Visualforce Page 中使用 JavaScript remoting。
首先,创建一个 Apex Controller, 名字是 AccountRemoter
:
global with sharing class AccountRemoter
{
@RemoteAction
global static Account getAccount(String name)
{
account = [select NumberOfEmployees
from Account where Name = :name];
return account;
}
}
除了在方法 getAccount
加了 @RemoteAction 注释以外,它看起来像一个 Apex Controller。
利用这个 remoting 方法,创建一个 Visualforce page:
<apex:page controller="AccountRemoter">
<script type="text/javascript">
function getRemoteAccount() {
var accountName = document.getElementById('acctSearch').value;
Visualforce.remoting.Manager.invokeAction(
'{!$RemoteAction.AccountRemoter.getAccount}',
accountName,
function(result, event){
if (event.status) {
// Get DOM IDs for HTML and Visualforce elements like this
document.getElementById('remoteAcctId').innerHTML = result.Id
document.getElementById(
"{!$Component.block.blockSection.secondItem.acctNumEmployees}"
).innerHTML = result.NumberOfEmployees;
} else if (event.type === 'exception') {
document.getElementById("responseErrors").innerHTML =
event.message + "<br/>\n" + event.where;
} else {
document.getElementById("responseErrors").innerHTML = event.message;
}
},
{escape: true}
);
}
</script>
<input id="acctSearch" type="text"/>
<button onclick="getRemoteAccount()">Get Account</button>
<div id="responseErrors"></div>
<apex:pageBlock id="block">
<apex:pageBlockSection id="blockSection" columns="2">
<apex:pageBlockSectionItem id="firstItem">
<span id="remoteAcctId"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem id="secondItem">
<apex:outputText id="acctNumEmployees"/>
</apex:pageBlockSectionItem>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:page>
Get Account button 执行分析
- 调用
getRemoteAccount()
JavaScript 方法。 - 获取 acctSearch 输入的值。
- JavaScript 使用了 invokeAction remoting call, 并利用$RemoteAction 来找到正确的 remote action method。
- 把获取到的 acctSearch 值作为一个参数传递到 remote action method。
- 如果方法成功执行,event.status 返回 true, 并且把 Account Id 和 Account 的 acctNumEmployees 值显示到页面上。
- 如果 event.status 返回 false, 或者返回的是 exception, 将把错误信息显示到 responseErrors 块中。
RemoteAction 执行成功
在 Salesforce 中创建一条 Name 是 Meginfo 的 Account 记录。然后打开上面创建的 Visualforce page, 你将看到一个输入框和一个 button。在输入框中输入 Meginfo
之后,单击 Get Account button。后台将执行 remoting 方法并获取该记录的 ID,然后显示它到页面上。感受一下速度,是不是非常的快。
RemoteAction 有异常
如果输入框中输入的文本在后台方法中找不到对应的 Account 记录,将返回一个异常信息并显示到页面上。
结语
JavaScript Remoting 最大的信息长度是1000000个字符。如果超出这个长度将返回一个异常信息,"Input too long. [0, 1000000]"。另外,在 Salesforce 中除了使用 JavaScript Remoting 做异步处理外,还可以使用 Action Function 功能。如果有人想要了解更多关于 Action Function 的信息可以访问此链接: apex:actionFunction