JavaScript Remoting の例
Visualforce ページでの JavaScript Remoting の使用方法の基本的なサンプルを次に示します。
まず、次のように AccountRemoter という Apex コントローラを作成します。
@RemoteAction アノテーション以外、これは他のコントローラ定義と同じように見えます。
1swfobject.registerObject("clippy.codeblock-0", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17global with sharing class AccountRemoter {
18
19
20
21 public String accountName { get; set; }
22
23 public static Account account { get; set; }
24
25 public AccountRemoter() { } // empty constructor
26
27
28
29 @RemoteAction
30
31 global static Account getAccount(String accountName) {
32
33 account = [SELECT Id, Name, Phone, Type, NumberOfEmployees
34
35 FROM Account WHERE Name = :accountName];
36
37 return account;
38
39 }
40
41}このリモートメソッドを使用するためには、次のような Visualforce ページを作成します。
このマークアップについては、次の点に注意してください。
1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<apex:page controller="AccountRemoter">
18
19 <script type="text/javascript">
20
21 function getRemoteAccount() {
22
23 var accountName = document.getElementById('acctSearch').value;
24
25
26
27 Visualforce.remoting.Manager.invokeAction(
28
29 '{!$RemoteAction.AccountRemoter.getAccount}',
30
31 accountName,
32
33 function(result, event){
34
35 if (event.status) {
36
37 // Get DOM IDs for HTML and Visualforce elements like this
38
39 document.getElementById('remoteAcctId').innerHTML = result.Id
40
41 document.getElementById(
42
43 "{!$Component.block.blockSection.secondItem.acctNumEmployees}"
44
45 ).innerHTML = result.NumberOfEmployees;
46
47 } else if (event.type === 'exception') {
48
49 document.getElementById("responseErrors").innerHTML =
50
51 event.message + "<br/>\n<pre>" + event.where + "</pre>";
52
53 } else {
54
55 document.getElementById("responseErrors").innerHTML = event.message;
56
57 }
58
59 },
60
61 {escape: true}
62
63 );
64
65 }
66
67 </script>
68
69
70
71 <input id="acctSearch" type="text"/>
72
73 <button onclick="getRemoteAccount()">Get Account</button>
74
75 <div id="responseErrors"></div>
76
77
78
79 <apex:pageBlock id="block">
80
81 <apex:pageBlockSection id="blockSection" columns="2">
82
83 <apex:pageBlockSectionItem id="firstItem">
84
85 <span id="remoteAcctId"/>
86
87 </apex:pageBlockSectionItem>
88
89 <apex:pageBlockSectionItem id="secondItem">
90
91 <apex:outputText id="acctNumEmployees"/>
92
93 </apex:pageBlockSectionItem>
94
95 </apex:pageBlockSection>
96
97 </apex:pageBlock>
98
99</apex:page>- JavaScript は、明示的な invokeAction Remoting コールを使用し、$RemoteAction グローバル変数を活用してリモートアクションメソッドの正しい名前空間を解決します。
- event.status 変数は、コールが成功した場合にのみ true になります。この例で示したエラー処理は意図的に単純にしてあり、エラーメッセージとスタック追跡が、event.message 値と event.where 値からそれぞれ出力されます。要求でメソッドコールが成功しない場合は、これに代わるさらに強固なロジックを実装することをお勧めします。
- result 変数は、Apex の getAccount メソッドから返されるオブジェクトを表します。
- プレーン HTML 要素の DOM ID へのアクセス方法は単純で、項目の ID を使用するだけです。
- ID が一意になるようにするために、Visualforce コンポーネントの DOM ID は動的に生成されます。上記のコードでは、$Component グローバル変数を介してコンポーネントにアクセスすることによってその ID を取得するために、「$Component を使用した JavaScript からのコンポーネントの参照」で説明した方法を使用しています。