Google Cloud Endpoints バックエンドで AngularJS フロントエンドを強化する方法を示す次のレシピを読みました。
私が理解できないのは、AngularJS と Cloud Endpoints の初期化に関する付録です。関連するセクションは次のとおりです。
付録: AngularJS + Cloud Endpoints の初期化に関するヒント ヒント #1: 初期化シーケンスに注意してください
ゲストブック アプリは、次の順序で 3 つの異なる JS ライブラリを読み込みます。
- AngularJS
- ゲストブックアプリ
- エンドポイント機能を含む Google API クライアント
この順序に従うために、index.html には、 各 JS ライブラリをロードするため
<script>
のタグに次のタグが含まれています。<head>
<script src="js/angular.min.js"></script> <script src="js/guestbook.js"></script> <script src="https://apis.google.com/js/client.js?onload=init"></script>
ロードされると、3 番目のライブラリ (Google API クライアント) は、その「onload」パラメーターで指定された初期化関数を呼び出します。この場合、init() 関数が予期され、呼び出されます。ヒント #2: できるだけ早く AngularJS の世界に入り込む
初期化シーケンスでは、次の 2 つの関数を使用します。
init() function window.init() function
この init() 関数は、guestbook.js で次のように定義されています。
function init() { window.init(); }
上記のコードを見るとわかるように、この関数は window.init() 関数 (つまり、グローバル ウィンドウ オブジェクトで定義された init() 関数) を呼び出すだけで、他には何もしません。window.init() は、AngularJS コントローラーで次のように定義されています。
$window.init= function() { $scope.$apply($scope.load_guestbook_lib); };
AngularJS では、グローバル ウィンドウ オブジェクトは、そのラッパーである「$window」表記によってアクセスされます。テスト容易性を向上させるために、window オブジェクトに直接アクセスしないことが AngularJS のベスト プラクティスです。
最初の init() メソッドで初期化を実行したくない理由は、コントローラー、サービス、ディレクティブなど、できるだけ多くのコードを AngularJS の世界に配置できるようにするためです。その結果、AngularJS のすべての機能を利用して、すべての単体テスト、統合テストなどを行うことができます。
init()
外部の JavaScript ファイルでグローバル関数が定義されているようです。このinit()
関数は呼び出すだけですwindow.init()
(ロード後に Google クライアント ライブラリによって呼び出されることになっています)。しかし、 window.init() はグローバルに定義されたinit()
関数に他なりませんか? window.init()
(したがってinit()
) が再定義されるまで、ここでループを取得しないのでしょうか?