2015-07-12 10 views
5

Ho scritto una fabbrica di Angular. C'è stato un errore critico per me. Ho vagato per aggiustarlo. Alla fine, ho risolto questo problema ... senza motivo. Quindi ho bisogno di una descrizione chiara del problema sotto il codice.Differenza tra angolare come variabile globale e parametro?

Ecco il mio codice A:

angular 
    .module('BinD', ['ngSails']) 
    .factory('UserService', function ($sails) { 
     ... 
    }); 

E un altro B è:

(function (angular) { 
    'use strict'; 

    angular 
    .module('BinD', ['ngSails']) 
    .factory('UserService', function ($sails) { 
     ... 
    }); 
})(angular); 

E la parte di errore è:

(function (angular) { 
'use strict'; 

angular 
    .module('BinD', ['ngSails']) 
    .controller('SignUpCtrl', function ($scope, $window, UserService) { 

codice B funziona bene. codice Un messaggio di errore creato "UserServiceProvider è sconosciuto (può?)". Non so davvero perché due codici identici funzionano diversamente. Fammi sapere.

risposta

3

Avvolgere la. La chiamata factory in una funzione non dovrebbe fare alcuna differenza. Penso che tu debba aver fatto un cambiamento diverso come bene.

Nel terzo frammento di codice, quando si chiama .module con due parametri si crea un nuovo modulo. Ciò sovrascriverebbe il modulo che hai creato in "Codice A" o "Codice B".

Non si riutilizza lo stesso modulo, ma ne viene creato uno nuovo. Quindi ha senso che il tuo UserService non esiste sul nuovo modulo.

L'ultimo snippet dovrebbe chiamare .module('BinD') con un solo parametro. Solo il nome del modulo che desideri utilizzare.

angular 
    .module('BinD') 
    .controller('SignUpCtrl', function ($scope, $window, UserService) { 

 


Un'altra opzione è che si chiama solo .module una volta, e lo si salva.

var app = angular.module('BinD', ['ngSails']); 

Poi, più tardi si può chiamare app.controller o app.factory, senza doversi preoccupare di sintassi.

+0

Aha, quindi dichiaro che modulo diverso 'BinD' e modulo devono essere gestiti una variabile esterna. È? –

+0

Il tuo secondo approccio non funzionerà mai nel suo caso. Nella seconda parte sta utilizzando il pattern IIFE. –

+0

@ user3413534 Se lo trovi più facile, puoi gestirlo in una variabile esterna. Questo è normalmente quello che faccio. –

2

Nella tua Codice A o Codice B sia in parte che aveva creato un modulo BinD con la dipendenza di ngSails e poi si sta registrando fabbrica con quel modulo, ma Codice A sarà dichiarare una variabile a livello globale, se lo stai usando & Il codice B eseguirà la codifica utilizzando il pattern IIFE che renderà la tua variabile disponibile solo nella funzione dichiarata. Ma questo non ha messo in relazione il tuo errore che stai ricevendo.

All'interno del vostro controller che si desidera utilizzare quella fabbrica, ma mentre si sta creando controller non è necessario creare un nuovo modulo come facendo angular.module('BinD', ['ngSails']), che svuotare la fabbrica registrato in precedenza (o altri componenti) con il modulo BinD e volontà crea un nuovo modulo con il nome BinD. Ecco perché dopo l'iniezione di UserService all'interno del controller viene generato un errore $injector, perché lo UserService non è disponibile all'interno di quel modulo.

controller

(function (angular) { 
'use strict'; 

angular 
    .module('BinD') //<- utilizing already created module 
    .controller('SignUpCtrl', function ($scope, $window, UserService) { 
Problemi correlati