2014-01-24 4 views
0

У меня есть приложение с несколькими видами и контроллерами. Контроллеры определяются в отдельных файлах .js и включены в нижнюю часть главной страницы. Однако при загрузке приложения один из контроллеров не загружается. Я упростил проблему и включил полный контент обоих JS-файлов в один.Контроллеры AngularJS как-то сталкиваются

С кодом ниже я получаю Argument 'ShellCtrl' is not a function, got undefined:

(function() { 
    var app = angular.module("app", []);  

    var shellCtrl = function ($scope, $log) { 
    // .... 

    app.controller("ShellCtrl", ["$scope", "$log", shellCtrl]); 
})(); 

(function() { 
    var app = angular.module("app", []); 

    var svcCenterSettingsCtrl = function($log) { 
    // .... 

    app.controller("ServiceCenterSettingsCtrl", ["$log", svcCenterSettingsCtrl]); 
})(); 

Если ServiceCenterSettingsCtrl зарегистрирован первый, то я получаю Argument 'ServiceCenterSettingsCtrl' is not a function, got undefined.

Однако, если я зарегистрирую их в рамках одной и той же функции самостоятельного выполнения, как показано ниже, она работает.

(function() { 
    var app = angular.module("app", []);  

    var shellCtrl = function ($scope, $log) { 
    // .... 

    app.controller("ShellCtrl", ["$scope", "$log", shellCtrl]); 


    var svcCenterSettingsCtrl = function($log) { 
    // .... 

    app.controller("ServiceCenterSettingsCtrl", ["$log", svcCenterSettingsCtrl]); 
})(); 

Есть ли опечатка, которую я не вижу, или я делаю что-то принципиально неправильно?

+0

That's потому что angular.module это создает новое приложение – hawk

ответ

2

Вы объявляете модуль приложения дважды в первом образце кода:

var app = angular.module("app", []);  

Модули могут быть зарегистрированы только один раз. Для ссылки на уже зарегистрированный модуль, который вы должны удалить второй параметр из функции:

var app = angular.module("app"); 
+0

я upvoted это потому, что это правильный ответ. Любопытство, будет ли обновление модуля практически переписывать все, что было связано с предыдущей декларацией? –

+0

@JoeMinichino Я думаю, что создание модуля redeclaration полностью перезаписывает предыдущий модуль. Вероятно, каждый, кто начинает с Углового, совершает эту ошибку. Для меня API было бы намного понятнее, если бы у него было две функции: одна для создания модуля, другая для извлечения модуля. –

+0

Спасибо! Вот и все. Возможно, не мое место, чтобы сказать, но это ужасный API. В соответствии с JavaScript, хотя (новый Array (5) и новый массив (5, 6) - совсем другое). –

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