標準ページへ埋め込むVisualforceページ開発でRemoteActionを利用するときの注意点です。RemoteActionの書き方はこんな感じです。
<apex:page standardController="Account" extensions="VFMessageController" showHeader="false"> <div id="vf-page"> <div id="vf-message" style="padding: 5px;"></div> </div> <script type="text/javascript"> (function(){ "use strict"; // 初期処理 function init() { VFMessageController.getMessage(function(result, event) { if(event.status) { console.log(result); document.getElementById('vf-message').innerHTML = result; } else { alert(event.message); } }); } init(); })(); </script> </apex:page>
public with sharing class VFMessageController { public VFMessageController(ApexPages.StandardController stdController) { } @RemoteAction public static String getMessage() { return 'VF Message!!'; } }
これでエラーもなく正常に実行されることを確認できます。
これをこのまま標準ページに埋め込んでみます。
単体では正常に表示されたVFページですが標準ページに埋め込むと・・・
このようにエラーになってしまいます。
Javascript proxies were not generated for controller VFMessageController: may not use public remoted methods inside an iframe.
標準ページに埋め込むVFではRemoteActionは利用できないのかと思ったりしたのですが、原因はpublic宣言にありました。このような使い方をする場合は、publicではなくglobalと宣言する必要があるみたいです。
global with sharing class VFMessageController { global VFMessageController(ApexPages.StandardController stdController) { } @RemoteAction global static String getMessage() { return 'VF Message!!'; } }
これで先程のエラーが解決して無事に表示されるようになりました。
今回、RemoteActionの戻り値はただのString型変数ですが、自作のWrapperクラスの場合はそちらもglobalの宣言にする必要がありました。
以上、RemoteActionと標準ページへのVF埋め込みについてです。