2013-08-16 19 views
5

Ho bisogno di aiuto. Sto imparando Angularjs e sto provando a creare un servizio. Attualmente sto cercando di separare tutto nei loro moduli. Quando creo un nuovo modulo chiamato (bac.route-manager) e provo ad inserirlo nella app config come RouterService, ottengo un errore che non capisco il significato o come risolverlo. Tutte le mie altre cose sembrano funzionare, tranne quando ho provato ad aggiungere questo modulo questo provider sconosciuto viene visualizzato solo dopo che ho provato a iniettarlo. Si prega di qualsiasi aiuto è apprezzato.angularjs Uncaught Errore: provider sconosciuto:

mio errore

Uncaught Error: Unknown provider: RouterService from bac 

miei app.js il file

angular.module('bac', [ 
    'bac.route-manager' 
]) 

.config(function bacAppConfig($routeProvider, RouterService) { 

    //I dont knwo if i can do this but right now it doesnt matter because of error 
    console.log(RouterService.getRoutes()); 
}); 

mio percorso-manager.js file di

angular.module('bac.route-manager', []) 

.service('RouterService', function() { 

    this.getRoutes = function() { 
     return { 
       "/login": { 
      templateUrl: 'app/modules/login-manager/partials/login.tpl.html', 
      requiredLogin: false 
     }, 

     "/dashboard": { 
      templateUrl: 'app/modules/dashboard-manager/partials/dashboard.tpl.html', 
      controller: 'DashboardController', 
      requiredLogin: true 
     } 

     }; 

}; 

});

Io uso grunt per generare js include nel mio file html ma qui è come appare con un sacco di cose rimosse per brevità.

mio index.html

<html lang="en" class="no-js" ng-app="bac"> 
    <body> 
     <ng-view></ng-view> 

    <script type="text/javascript" src="vendor/angular/angular.js"></script> 
    <script type="text/javascript" src="app/app.js"></script> 
    <script type="text/javascript" src="app/modules/dashboard-manager/dashboard-manager.js"></script> 
    <script type="text/javascript" src="app/modules/route-manager/route-manager.js"></script> 

    </body> 
</html> 
+0

Prova a caricare 'route-manager.js' prima di' app.js' – AlwaysALearner

+0

L'ho appena provato. Ho generato il file index.html con grunt e poi sono entrato e ho spostato manualmente il file route-manager.js sopra tutto tranne il file app.js. Ancora lo stesso errore. Errore non rilevato: provider sconosciuto: RouterService da bac – lumberjacked

+0

@Codezilla La fase di configurazione e di esecuzione viene posticipata fino a quando non viene caricato l'intero documento. L'ordine in cui appaiono è irrilevante in questo caso. –

risposta

17

Nella fase config, i servizi dichiarati non sono ancora disponibili. Solo quelli che sono stati dichiarati utilizzando provide tramite serviceNameProvider (aggiungi Provider dopo il nome definito). Per esempio:

.provide('RouterService', function() { 
    var service = { }; 
    var routes = { 
    "/login": { 
     templateUrl: 'app/modules/login-manager/partials/login.tpl.html', 
     requiredLogin: false 
    }, 
    "/dashboard": { 
     templateUrl: 'app/modules/dashboard-manager/partials/dashboard.tpl.html', 
     controller: 'DashboardController', 
     requiredLogin: true 
    }}; 

    service.getRoutes = function() { return routes; }; 

    this.$get = function() { return service; } 

    this.setupRoute = function(data) { /* something here */ }; 
}; 

Quando si ottiene un provider, tutto il metodo definito in this sarà disponibile. Quando si accede al servizio normale, ciò che viene iniettato è il ritorno della funzione $get. A seconda di quello che vi serve, vi sia bisogno di cambiare il vostro servizio per utilizzare provide o chiedere di essere iniettato con il servizio nel metodo run:

angular.module('bac', ['bac.route-manager']) 
    .config(function ($routeProvider, RouterServiceProvider) { 
    // Here, only RouterServiceProvider.setupRoute will be available 
    }).run(function (RouterService) { 
    // Here, the service singleton return with the $get function will 
    // be injected 
    console.log(RouterService.getRoutes()); 
}); 

Modifica

Come nota a margine, io credo che, anche se è stato definito il vostro RouterService come service chiedendo RouterServiceProvider sarebbe ancora funzionare, ma nessun metodo sarà presente come service è essenzialmente un wrapper provider solo restituire la funzione nel $get

+0

Grazie per la risposta. Ho intenzione di ri-fattore e poi segnerò questo come risposta. – lumberjacked

+0

La conversione del servizio in un provider funziona. Ma sono confuso su come implementare il metodo $ get. All'interno del provider ho aggiunto un metodo this.getRoutes() in modo che potessi eseguire il ciclo successivo attraverso l'oggetto per configurare i percorsi in $ routeProvider.Non ho davvero bisogno di un metodo $ get in questa fase, forse più tardi, ma non posso semplicemente iniettare il RouterServiceProvider in un controller per usare il metodo this.getRoutes(). – lumberjacked

Problemi correlati