2013-01-01 11 views
8

私は非同期的に私のページにロードする第三者のライブラリを持っており、私はそれをサービスとして使いたいと思います。AngularJS - サービスとしてサードパーティの非同期ロードされたライブラリをラップする

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

現時点では私のアプローチは、そうのようなものです:角度範囲の外

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

し、ページ上の

(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

働かが$qであなたのライブラリの呼び出しをラップすることです。この角度サービスは、ライブラリが完全にロードされたときに解決できる約束を返します。あなたが結果を処理するthen()機能を使用して、コントローラで

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

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

あなたdoStuff機能は次のようなものになるだろう。

2番目の可能性は、コールバックによるものです。両方のタイプのexampleがあります。

ライブラリがDOMを操作している場合は、ディレクティブでラップする方がよいでしょう。

+0

cool私はこのアプローチを使用します。ありがとう:) –

+0

jsFiddleの例は素晴らしいです!コールバックは私にとって素晴らしい仕事でした。 – Rob

関連する問題