8

ページに非同期で読み込まれるサードパーティのライブラリがあり、それをサービスとして使用したいと思います。

ローディングコードをAngularサービス内にラップするにはどうすればよいですか?一般的に、ベストプラクティスは何でしょうか?

現時点では、私のアプローチは次のようなものです。

angular.module('myAPIServices', []).
factory('MyAPI', function () {
    return {
        \\ API is declared at the loaded script
        doStuff:function(){$window.API.doStuff()} 
    };
});

次に、Angularスコープ外のページに

(function () {
    var js = document.createElement('script');
    var loc = document.getElementsByTagName('script')[0];
    js.async = true;
    js.src = "myAPI.js";
    loc.parentNode.insertBefore(js, loc);
}());
4

1 に答える 1

4

可能性は、ライブラリ呼び出しを$qでラップすることです。このAngularサービスはPromiseを返します。これは、ライブラリが完全にロードされたときに解決できます。

関数doStuffは次のようになります。

doStuff: function() {
   var deferred = $q.defer();

   myAsyncCall().success(function(data) {
      deferred.resolve(data);
   });
   return deferred.promise;
}

コントローラでは、then()関数を使用して結果を処理します。

2番目の可能性はコールバックです。両方のタイプの例を次に示します。

ライブラリがDOMを操作している場合は、それをディレクティブでラップすることをお勧めします。

于 2013-01-01T08:57:58.927 に答える