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()) が再定義されるまで、ここでループを取得しないのでしょうか?