2013-08-16 83 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

相关问题