2013-08-16 93 views
5

我需要一些幫助。我正在學習Angularjs並試圖創建一項服務。目前我正在嘗試將模塊中的所有內容分開。當我創建一個名爲(bac.route-manager)的新模塊並嘗試將其作爲RouterService注入到應用程序配置中時,我收到一個錯誤,我不明白其含義或如何解決該錯誤。除了當我嘗試添加此模塊時,我所有其他的東西似乎都可以工作,但只有在嘗試注入後,此未知提供者纔會開始顯示。請任何幫助表示讚賞。angularjs未被捕獲的錯誤:未知的提供者:

我的錯誤

Uncaught Error: Unknown provider: RouterService from bac 

我app.js文件

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()); 
}); 

我的路由manager.js文件

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 
     } 

     }; 

}; 

});

我使用grunt生成js包括在我的html文件中,但這裏是爲了簡潔而刪除了大量內容。

我的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

嘗試在'app.js'前加載'route-manager.js' – AlwaysALearner

+0

我剛試過。我用grunt生成了index.html文件,然後進入並手動將route-manager.js文件移至除app.js文件之外的所有文件之上。同樣的錯誤。未捕獲的錯誤:未知的提供者:來自bac的RouterService – lumberjacked

+0

@Codezilla配置和運行階段被推遲到整個文檔被加載。它們出現的順序在這種情況下是無關緊要的。 –

回答

17

config階段,宣告了服務尚未公佈。只有通過provide宣佈的人才能通過serviceNameProvider(在您定義的名稱後添加Provider)。例如:

.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 */ }; 
}; 

當你得到一個提供者,在this定義的所有方法都可用。當你訪問正常的服務時,注入的是$get函數的返回值。根據你需要什麼,你要麼需要改變你的服務才能使用provide,或要求將在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()); 
}); 

編輯

作爲一個方面說明,我相信即使您已經定義了RouterServiceservice,要求RouterServiceProvider仍然工作,但沒有一種方法會存在service本質上是一個包裝周圍provider只返回功能在$get

+0

感謝您的回覆。我將重新考慮因素,然後我將其標記爲答案。 – lumberjacked

+0

將服務轉換爲提供程序。但是我很困惑如何實現$ get方法。在提供程序內部,我添加了一個this.getRoutes()方法,以便我可以通過該對象循環來配置$ routeProvider中的路由。在這個階段,我確實不需要$ get方法,也許以後,但是我不能只在控制器中注入RouterServiceProvider以使用this.getRoutes()方法。 – lumberjacked

相關問題