0

私は AngularJS の初心者で、少し些細なことをしようとしていますが、何が最善のアプローチであるかを判断するのに苦労しています。

AnuglarJS には、サーバーとのすべての REST 通信を処理するサービスがあります。

クライアント/サーバー間で URL 名が変更されるのを避けるために、get_apis と呼ばれる REST API を作成しました。この API は、次のような親しみやすい名前ですべての API 関数の配列を返します。

{
    'get_user' :'/api/get_user',
    'delete_user' : '/api/delete_user'
}

私が抱えている問題は、他のすべてのサービス/コントローラーがこの呼び出しに依存していることです。そうしないと、この呼び出しが完了するまで、他の残りの操作に APIS を使用できません。

API サービス コンストラクターで get_apis 残りの操作を行っていると仮定すると、残りの操作は非同期であるため、API があることを確認できません。

それを行うための「正しい方法」はありますか?私のURLを再マッピングする私のアプローチが間違っているのでしょうか?

4

4 に答える 4

1

これを実現する 1 つの方法は、起動時にサービスを必要とするコンポーネントのコードを関数でラップすることです (それらがコントローラーにあると仮定します)。$rootScope次に、言及した API サービス コンストラクターに注入します。は$rootScope、起動時に API を取得し、 を使用して初期化イベントをディスパッチします。他のコンポーネント (コントローラなど) は、起動関数を呼び出すこと$broadcast('eventName')で に応答できます。$on('eventName')

編集:問題を正しく理解していれば、これを示すフィドルがあります。

于 2013-10-31T10:24:36.940 に答える
0

問題を完全に理解しているかどうかはわかりませんが、REST 呼び出しの URL を中央の場所で定義して、すべてのサービスで使用できるようにするだけの場合は、次のようにします。

angular.module('myApp', [])
  .constant('REST_API_URLS', (function () {
      return {
        'get_user' :'/api/get_user',
        'delete_user' : '/api/delete_user'
      };
    })()
  )
  .service('MyRESTService', function ($http, REST_API_URLS) {
    $http.get(REST_API_URLS.get_user)
    .success() // etc
  });
于 2013-10-31T10:51:28.253 に答える
0

API リファレンス / angular.bootstrapここでangular.bootstrap の例を含むいくつかの可能性の比較を見つけることができます。

専用の初期化サービスを使用した別のアプローチを使用してアプリを構成し、他のコントローラーまたはサービスが初期化タスクを完了するまでコントローラーを強制的に待機させました。非常に詳細な説明がブログにあり、AngularJSフォーラムでいくつかの議論が始まっています。コードはjsfiddleとして入手でき、コントローラー内では次のようになります。

init('userCtrl', [apiResolutionService.getApiUrls()], function(result) {
    var apiUrls = result[0].data.apiUrls;
    var user = $http.get(apiUrls.get_user, ...);
});
于 2013-10-31T20:49:31.777 に答える