2013-01-01 12 views
8

Ho una libreria di terze parti che viene caricata sulla mia pagina in modo asincrono e vorrei utilizzarla come servizio.AngularJS - wrapping libreria asincrona di terze parti come servizio

Come posso avvolgere il codice di caricamento all'interno di un servizio angolare? In generale, quale sarebbe la migliore pratica?

Al momento il mio approccio è qualcosa in questo modo:

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

e quindi nella pagina di fuori del campo di applicazione angolare

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

risposta

4

Una possibilita 'è quello di avvolgere la chiamata di libreria in $q. Questo servizio angolare restituisce una promessa, che è possibile risolvere quando la libreria è completamente caricata.

La funzione doStuff sarebbe qualcosa di simile:

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

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

Nel vostro controller si utilizza la funzione then() per elaborare i risultati.

Una seconda possibilità è con un callback. Ecco uno example di entrambi i tipi.

Se la libreria sta manipolando il DOM, è meglio racchiuderlo in una direttiva.

+0

cool Userò questo approccio, grazie :) –

+0

Gli esempi su jsFiddle sono fantastici! Il callback ha funzionato benissimo per me. – Rob

Problemi correlati