2012-11-19 12 views
22

Ho seguito tutte le istruzioni che riesco a trovare per risolvere il problema, ad es.Rails 3 + angularjs + minification non funziona in produzione: provider sconosciuto: eProvider

var MyController = function(renamed$scope, renamedGreeter) { 
... 
} 
MyController.$inject = ['$scope', 'greeter']; 

e

someModule.factory('greeter', ['$window', function(renamed$window) { 
...; 
}]); 

ancora angolare rifiuta di lavorare ancora. Viene sempre visualizzato l'errore "Provider sconosciuto: eProvider"

Ecco i miei due tentativi per farlo funzionare ... qualcuno può aiutarti?

https://github.com/jemminger/angular-test1

https://github.com/jemminger/angular-test2

hanno già avuto i beni precompilati e modalità di sviluppo è configurato per funzionare come la produzione, così si dovrebbe solo essere in grado di "rotaie s" per vedere che (non) lavoro .

+0

A seconda i propri obiettivi, una possibile soluzione è quella di ridimensionare il minifier alle ottimizzazioni meno desctructive. Nel caso di 'uglify' puoi usare la configurazione' mangle: false' e ​​salvare ancora parecchi kilobyte con la rimozione degli spazi bianchi. – rymo

risposta

60

Trovato! Non hanno mai detto di applicare le correzioni di iniezione ai servizi anche ... La soluzione è quella di cambiare questo:

angular.module('itemServices', ['ngResource']). 
    factory('Item', function($resource){ 
     return $resource('items/:item_id.json', {}, { 
     query: {method:'GET', params:{ item_id: 'all' }, isArray:true} 
     }); 
    }); 

a questo:

angular.module('itemServices', ['ngResource']). 
    factory('Item', ['$resource', function($resource){ 
     return $resource('items/:item_id.json', {}, { 
     query: {method:'GET', params:{ item_id: 'all' }, isArray:true} 
     }); 
    }]); 
+1

Grazie per questo! : D –

+0

+1 ha avuto un "incidente" come questo solo in un '.run()' config. – kaiser

+0

Non puoi [ngmin] (https://egghead.io/lessons/angularjs-ngmin) fare questo per te? – escapedcat

6

Assicurarsi di applicare il modello di DI funzione ALL definizioni che richiedono l'iniezione all'interno del modulo. Può essere facile perdersi. Se si sta utilizzando una routeProvider, factory, servizi, ecc., È necessario che sia applicato il pattern DI. Ho finito per distribuire più volte prima di averli visti tutti: P

+1

+1 per routeProvider –

+0

'Può essere facile perdere uno .' Esattamente. È necessario applicare il modello anche ai controller definiti nelle direttive! Ho sprecato un'ora meravigliosa alla ricerca di questo bug. – tsikov

14

Ricordare, per utilizzare anche i controller DI all'interno delle direttive. Mi ha portato ore ... CS esempio:

sbagliato:

controller: ($scope) -> 
    $scope.closeModal = -> 
    ModalService.close() 

destra:

controller: ["$scope" 
    ($scope) -> 
    $scope.closeModal = -> 
     ModalService.close() 
] 
+0

Mi ha salvato un sacco di problemi, grazie per il suggerimento. – jlr

+12

Ciò sarebbe più utile se non si basasse sul lettore utilizzando la scelta di soluzioni di scripting. – ericpeters0n