So che questa è una vecchia domanda, ma stavo guardando le opzioni per farlo di recente, quindi ho pensato di mettere le mie conclusioni qui nel caso in cui sia utile a chiunque.
Nella maggior parte dei casi, se è necessario che il codice legacy esterno interagisca con lo stato dell'interfaccia utente o il funzionamento interno dell'applicazione, un servizio può essere utile per astrarre tali modifiche. Se un codice esterno interagisce direttamente con il tuo controller angolare, componente o direttiva, stai accoppiando la tua app pesantemente con il tuo codice legacy che è una cattiva notizia.
Quello che ho finito per usare nel mio caso, è una combinazione di globali accessibili dal browser (cioè la finestra) e gestione degli eventi. Il mio codice ha un motore di generazione di moduli intelligenti che richiede l'output JSON da un CMS per inizializzare i moduli. Ecco quello che ho fatto:
function FormSchemaService(DOM) {
var conf = DOM.conf;
// This event is the point of integration from Legacy Code
DOM.addEventListener('register-schema', function (e) {
registerSchema(DOM.conf);
}, false);
// service logic continues ....
Modulo di Servizio Schema viene creata usando iniettore angolare come previsto:
angular.module('myApp.services').
service('FormSchemaService', ['$window' , FormSchemaService ])
E nei miei controllori: function() { 'use strict';
angular.module('myApp').controller('MyController', MyController);
MyEncapsulatorController.$inject = ['$scope', 'FormSchemaService'];
function MyController($scope, formSchemaService) {
// using the already configured formSchemaService
formSchemaService.buildForm();
Finora questa è pura programmazione angolare e orientata ai servizi javascript. Ma l'integrazione legacy viene qui:
<script type="text/javascript">
(function(app){
var conf = app.conf = {
'fields': {
'field1: { // field configuration }
}
} ;
app.dispatchEvent(new Event('register-schema'));
})(window);
</script>
Ovviamente ogni approccio ha i suoi pregi e difetti. I vantaggi e l'utilizzo di questo approccio dipendono dall'interfaccia utente. Gli approcci precedentemente suggeriti non funzionano nel mio caso poiché il mio schema di modulo e il codice precedente non hanno controllo e conoscenza degli ambiti angolari. Quindi la configurazione della mia app basata su angular.element('element-X').scope();
potrebbe interrompere l'app se cambiamo gli ambiti. Ma se la tua app ha conoscenze specifiche e può fare affidamento su di essa non cambiando spesso, ciò che viene suggerito in precedenza è un approccio praticabile.
Spero che questo aiuti. Qualsiasi feedback è anche il benvenuto.
Si noti che nel jsfiddle sopra l'iniettore si ottiene senza puntare un elemento all'interno dell'app utilizzando 'var injector = angular.injector (['ng', 'MyApp']);'. In questo modo avrai un contesto completamente nuovo e un duplicato 'myService'. Ciò significa che ti ritroverai con due istanze del servizio e del modello e aggiungerai i dati nel posto sbagliato. Dovresti invece indirizzare un elemento all'interno dell'app usando 'angular.element ('# ng-app'). Injector (['ng', 'MyApp'])'. A questo punto puoi usare $ apply per avvolgere le modifiche del modello. –