6

Google Cloud Endpoints バックエンドで AngularJS フロントエンドを強化する方法を示す次のレシピを読みました。

https://cloud.google.com/resources/articles/angularjs-cloud-endpoints-recipe-for-building-modern-web-applications

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

4

2 に答える 2