2015-03-09 2 views
0

Я получаю эту ошибку, когда я пытаюсь прикрепить службу к контроллеру: [$ форсунки: unpr] ... webSocketServiceProvider < - webSocketService < - videoMenuCtrlНевозможно присоединить angularjs службы к контроллеру

I имеют plunker определенный с довольно минимальной настройкой, которая воспроизводит эту проблему:

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

Вот главные виновник файлы:

index.ht мл:

<!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. Есть идеи? Благодаря!

Редактировать: Изменено имя файла typo.

+0

Когда вы импортируете файл 'videoMenuCtrl.js'? Если это так же, как 'videoMenu.js', вам нужно загрузить этот файл до' webSocketService.js', поскольку последний использует модуль, определенный в первом. – floribon

+0

Моя опечатка. videoMenuCtrl.js должен быть videoMenu.js. (Я его отредактирую). Первоначально у меня был videoMenu.js, указанный перед webSocketService.js в моем index.html, но изменил его, потому что videoMenu ссылается на webSocketService, поэтому я решил, что он должен быть первым. –

ответ

1

Я получил ваш код. Две вещи, которые я заметил:

  1. В вас webSocketService.js вы были повторно объявить videoApp модуль.
  2. Вы объявляли модуль внутри выражения функции, которое не вызывалось.

Я повторно объявил о вашем обслуживании в надлежащим образом размещенном в пространстве модуле и завернул его в immediately invoked function expression.

Я также удалил ваше объявление var app = с вашего videoMenuCtrl и завернул его в IIFE. Это делается для того, чтобы избежать загромождения глобального пространства имен. Вот рабочий звенеть:

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

EDIT (осветления) В IIFEs не является строго необходимым в моем примере шлепнуть, поскольку var app = декларация была удалена из кода. Это была единственная переменная, которая была объявлена ​​в глобальном пространстве имен в исходном примере. Однако, обертывание кода в IIFE не имеет никаких отрицательных эффектов, насколько я знаю.

+0

Обычно вы также загружаете зависимости всплывающих окон и диалогов, прежде чем вводить их в приложение. И все обертывание в IIFE совершенно не важно, потому что не объявлено глобальных варсов. – iH8

+0

Является 'var app = угловым.module ('videoApp', ['ngDialog', 'ngPopup']); 'не объявление глобальной переменной (в примере OP), или вы имели в виду мой плунж? –

+0

Да, я имел в виду ваш plunk, так как вы удалили переменную приложения, вы также можете удалить IFFE. – iH8

Смежные вопросы