无法将angularjs服务附加到控制器

时间:2015-03-09 23:12:29

标签: angularjs angularjs-service

当我尝试将服务附加到控制器时,我收到此错误: [$ injector:unpr] ... webSocketServiceProvider< - webSocketService< - videoMenuCtrl

我有一个使用相当小的设置定义的plunker来重现问题:

http://plnkr.co/edit/ptaIaOhzOIG1mSi4bPyF?p=preview

以下是主要罪魁祸首文件:

的index.html:

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>title</title>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
  </head>
  <body ng-app="videoApp">
    <section class="menu" ng-controller="videoMenuCtrl">
    </section>
    <script src="webSocketService.js"></script>
    <script src="videoMenu.js"></script>
    <script src="ngDialog.min.js"></script>
    <script src="ngPopup.min.js"></script>
</body>
</html>

webSocketService.js:

(function(angular) { 
    'use strict';

angular.module('videoApp')
    .factory('webSocketService', function($q) {
    return{};
});
});

videoMenu.js:

'use strict';

var app = angular.module('videoApp', ['ngDialog', 'ngPopup']);

app.controller('videoMenuCtrl', function($scope, $window, $location, ngDialog, webSocketService) {

});    

如果从控制器中删除webSocketService,我不会收到错误,但重点是让控制器能够访问webSocketService。有任何想法吗?谢谢!

编辑:更改了文件名拼写错误。

1 个答案:

答案 0 :(得分:1)

我的代码正常运行。我发现了两件事:

  1. 在您webSocketService.js中,您重新声明了videoApp模块。
  2. 您在一个未被调用的函数表达式中声明了该模块。
  3. 我在正确命名空间的模块中重新声明了您的服务并将其包装在immediately invoked function expression中。

    我还从var app =删除了您的videoMenuCtrl声明,并将其包装在IIFE中。这是为了避免使全局命名空间混乱。这是一个有效的插件:

    http://plnkr.co/edit/A8BcATiaqhXCA7BZDXWx?p=preview

    编辑澄清)在我的示例插件中,IIFE并不是绝对必要的,因为var app =声明已从代码中删除。这是在原始示例中在全局命名空间上声明的唯一变量。 然而,据我所知,在IIFE中包装代码没有任何负面影响。