2012-10-17 15 views
7

Sto utilizzando AngularJS in un progetto Ruby on Rails 3.2.8 con risorse.Errore: provider sconosciuto: aProvider <- a

Quando carico il modulo che utilizza AngularJS sul mio computer di sviluppo, non ho alcun problema. Tuttavia quando carico la stessa forma sul mio server di produzione ottengo questo errore nella console Javascript:

Error: Unknown provider: aProvider <- a 

ho rintracciato di nuovo al mio file CoffeeScript dove ho AngularJS di configurazione per l'utilizzo all'interno di un modulo:

Se commento tutto questo la pagina verrà caricata senza errori e senza le abilità AngularJS.

Il problema è dovuto alla compilazione e alla riduzione delle risorse di Rails? C'è un modo per risolvere questo problema e utilizzare ancora le risorse coffeescript e Rails?

+1

Ho notato che se '$ scope' viene rinominato, si spezzerebbe. Suggerisco di iniettare esplicitamente '$ scope' tramite' app.controller ('TimesheetCtrl', ['$ scope', function ($ scope) {...}]); '(in modo equivalente cofeescript) Ci possono essere altri tali istanze, però. – Tosh

+0

Questo l'ha risolto, grazie. – map7

risposta

20

AngularJS, quando si utilizza lo stile che si sta utilizzando in questo momento (chiamato pretotyping), utilizza i nomi degli argomenti della funzione per eseguire l'iniezione di dipendenza. Quindi sì, la minificazione rompe completamente questo.

La correzione è semplice, però. In tutti i casi in cui è necessario l'iniezione (sono utilizzando '$ xxx') variabili, fare questo:

app.controller "TimesheetCtrl", ['$scope', ($scope) -> 
    $scope.costed_amount = 0 
] 

In sostanza, sostituire tutte le definizioni di funzioni con una matrice. L'ultimo elemento dovrebbe essere la definizione della funzione stessa e i primi sono gli $names degli oggetti che si desidera iniettare.

Sono disponibili ulteriori informazioni (anche se non abbastanza chiare) su docs.

+0

Qui ci sono ulteriori informazioni: http: //docs.angularjs.org/tutorial/step_05 Cerca "A Note on Minification" –

+2

E puoi usare l'ottimo, ottimo modulo ng-min che si prende cura di questo per te. Molto ben spiegato su egghead.io: https://egghead.io/lessons/angularjs-ngmin – Mat

+1

Assicurati di applicare questo modello anche ai controller specifici della direttiva! – tsikov

6

Se si perde la notazione dell'array da qualche parte, per individuarlo è necessario modificare il codice angolare un po ', ma la sua soluzione molto rapida.

modifica è console.log ("Notazione array mancante", fn); (linea n ° 11 dalla funzione start)

Scoprite la funzione di annotazione in angular.js (non minified)

function annotate(fn) { 
     var $inject, 
      fnText, 
      argDecl, 
      last; 

     if (typeof fn == 'function') { 
     if (!($inject = fn.$inject)) { 
      $inject = []; 
      if (fn.length) { 
console.log("Array Notation is Missing",fn); 
fnText = fn.toString().replace(STRIP_COMMENTS, ''); 
     argDecl = fnText.match(FN_ARGS); 
     forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){ 
      arg.replace(FN_ARG, function(all, underscore, name){ 
      $inject.push(name); 
      }); 
     }); 
     } 
     fn.$inject = $inject; 
    } 
    } else if (isArray(fn)) { 
    last = fn.length - 1; 
    assertArgFn(fn[last], 'fn'); 
    $inject = fn.slice(0, last); 
    } else { 
    assertArgFn(fn, 'fn', true); 
    } 
    return $inject; 
} 
+0

questo è un ottimo suggerimento, grazie – Jason

+0

Questo era l'unico modo per trovare la mia sintassi di array mancante. Grazie mille! +1 –

0

Per minify angolare tutto ciò che serve è fare è di cambiare la vostra dichiarazione alla " matrice modalità" dichiarazione "" per esempio:

Da:

var demoApp= angular.module('demoApp', []); 
demoApp.controller(function demoCtrl($scope) { 
}); 

Per

var demoApp= angular.module('demoApp', []); 
demoApp.controller(["$scope",function demoCtrl($scope) { 
}]); 

Come dichiarare servizi di fabbrica?

demoApp.factory('demoFactory', ['$q', '$http', function ($q, $http) { 
    return { 
      //some object 
    }; 
}]); 
Problemi correlati