当我尝试将服务附加到控制器时,我收到此错误: [$ 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。有任何想法吗?谢谢!
编辑:更改了文件名拼写错误。
答案 0 :(得分:1)
我的代码正常运行。我发现了两件事:
webSocketService.js
中,您重新声明了videoApp
模块。我在正确命名空间的模块中重新声明了您的服务并将其包装在immediately invoked function expression中。
我还从var app =
删除了您的videoMenuCtrl
声明,并将其包装在IIFE中。这是为了避免使全局命名空间混乱。这是一个有效的插件:
http://plnkr.co/edit/A8BcATiaqhXCA7BZDXWx?p=preview
编辑(澄清)在我的示例插件中,IIFE并不是绝对必要的,因为var app =
声明已从代码中删除。这是在原始示例中在全局命名空间上声明的唯一变量。 然而,据我所知,在IIFE中包装代码没有任何负面影响。