AngularJSでファイル添付ができるVFページをつくってみました。
入力画面
確認画面
保存実行結果
Thanks画面
ちゃんと保存処理が実行されていて
添付ファイルも登録できています。
エラーメッセージはこんな感じです。
開発のポイント
共通変数
AngularJSでは別々のコントローラで共通で利用できる変数は、factoryで用意できます。
var app = angular.module("Controllers", []); // 共通変数:Account app.factory('Wrapper', function() { return { Account : { Name : 'salesforce.com', AccountNumber : 'SF-001' }, Attachment : { FileName : '', FileSize : '', UploadFile : '' } }; });
inputFileと複数ページ
VFページの開発にはapex:inputFileタグが用意されています。reRenderが利用できなくなるなどの制約がありますが、一番の問題はapex:inputFileで選択したファイル情報をApexクラス側の変数に保持して、画面遷移などの操作を行うとビューステートエラーが発生してしまうことです。
今回のように複数のページにまたがってファイル情報を保持したい場合は、Apex側の変数に保持するのを諦めてJS側で対応する方が良さそうです。
apex:formとngRoute
AngularJSでシングルページアプリケーションを開発する場合、ngRouteを利用すると思います。これを利用する場合、apex:formの宣言ができなくなってしまいます(たぶん)。その結果、apex:input系のタグが利用できなくなるので注意が必要です。
少し前にSalesforce Advent Calendar 2015でVFとAngularについての記事を投稿しました。
その記事内ではngRouteを利用しないページで試していたので気づきませんでしたが、ngRouteを利用するとVFページとしては別々に用意していくので、呼び出し元の親ページでapex:formタグを宣言して置いても、各ページ内には存在しない扱いになってしまいます。
むりやり宣言してもapex:formタグがng-appの中にあるとエラーになったりするのでそのあたりの注意が必要になります。
サンプルコード
今回つくったサンプルページのコードです。
追記
上記方法ではいくつか考慮しなくてはいけない問題が考慮できていませんでした。以下リンク先にそのあたりについてまとめています。