tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:AngularJSでファイル添付ができるVFページをつくってみました

AngularJSでファイル添付ができるVFページをつくってみました。

入力画面

f:id:tyoshikawa1106:20160127025407p:plain

確認画面

f:id:tyoshikawa1106:20160127025425p:plain

保存実行結果

f:id:tyoshikawa1106:20160127025442p:plain:w300

Thanks画面

f:id:tyoshikawa1106:20160127025516p:plain


ちゃんと保存処理が実行されていて
f:id:tyoshikawa1106:20160127025606p:plain


添付ファイルも登録できています。
f:id:tyoshikawa1106:20160127025627p:plain


エラーメッセージはこんな感じです。
f:id:tyoshikawa1106:20160127025708p:plain:w400

開発のポイント

共通変数

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の中にあるとエラーになったりするのでそのあたりの注意が必要になります。
f:id:tyoshikawa1106:20160127030617p:plain

サンプルコード

今回つくったサンプルページのコードです。

追記

上記方法ではいくつか考慮しなくてはいけない問題が考慮できていませんでした。以下リンク先にそのあたりについてまとめています。