tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:RemoteActionとreRenderでハマった話

Visualforceページの開発中、apex:component内のJavaScriptからRemoteActionの処理を実行した際に「is not defined」エラーが発生する現象に遭遇しました。

f:id:tyoshikawa1106:20140206221444p:plain


どうやらreRenderで画面を再描画したときにRemoteActionの処理が消えてしまうみたいです。

reRenderで再描画するとき必ず発生するというわけではなかったので、どういう条件のときにエラーが発生するか検証してみました。


次の条件のときに「is not defined」が発生するみたいです。

  • RemoteActionはコンポーネント内で実行されている
  • コンポーネントはrenderedで表示が制御されていてreRender時に切り替わる。
    • 「例→<c:RemoteActionReRender rendered="{!isComponentView}" />」


page側のヘッダーや標準StyleSheet、pageタグのactionの有無はエラーの発生には影響ありませんでした。


RemoteActionの処理がpublicではなくGrobalなら発生しないかと思い試してみましたが、それもエラーになりました。


RemoteActionで呼び出されるClass側の処理に問題があるか確認するため「return」だけの処理にして試してみましたが、エラーが発生したのでClass側の処理は発生条件には関係ないと思います。


RemoteActionの処理をコンポーネントの外に移動して実行してみたところ、今回の検証コードではエラーがでませんでしたが、何らかの原因でエラーが発生するケースも確認しています。


reRenderの指定を外すことでエラーがでなくなりますが、reRenderを外すと画面再描画時にチラツキがでてしまうので、できれば他の方法で表示を切り替えるようにした方が良さそうです。


検証時はRemoteActionの実行タイミングはコンポーネントが表示されるタイミングで確認しましたが、ボタンのonClickイベントで実行したときにも「is not defined」は発生することも確認しています。コンポーネント内でのRemoteActionとreRenderの組み合わせは避けたほうがいいみたいです。


今回検証時に使用したコードはこちらになります。Developer環境で動作を確認できると思います。

@RemoteActionとreRenderでエラーが発生する条件の検証


このエラーですがコンポーネントのコードが変更された後は正常に実行されるという不思議な現象も発生しています。正常に実行されたときは、F5などで画面を更新してもう一度実行するとエラーが発生することを確認できると思います。