2013-01-01 14 views
8

Mam bibliotekę innej firmy, która ładuje się do mojej strony asynchronicznie i chciałbym użyć jej jako usługi.AngularJS - pakowanie biblioteki ładowanej przez użytkownika asynchronicznego jako usługa

Jak mogę zawinąć kod ładujący wewnątrz kątowej usługi? Ogólnie, jaka byłaby najlepsza praktyka?

W tej chwili moje podejście jest czymś tak:

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

a następnie na stronie poza zakres kątowy

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

Odpowiedz

4

Państwo możliwość jest zawinąć rozmowy biblioteki w $q. Ta usługa kątowa zwraca obietnicę, którą możesz rozwiązać, gdy biblioteka zostanie w pełni załadowana.

Twoja funkcja doStuff byłoby coś jak:

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

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

w kontroler użyć funkcji then() do przetwarzania wyników.

Druga możliwość dotyczy wywołania zwrotnego. Oto example obu typów.

Jeśli biblioteka manipuluje modelem DOM, lepiej jest zawrzeć ją w dyrektywie.

+0

fajnie będę używać tego podejścia, dzięki :) –

+0

Przykłady na jsFiddle są niesamowite! Callback działał doskonale dla mnie. – Rob

Powiązane problemy