AngularJS: Как создать контроллеры в нескольких файлах

Я пытаюсь разбить мои контроллеры на несколько файлов, но когда я пытаюсь зарегистрировать их в моем модуле, я получаю сообщение об ошибке:

groupcontroller.coffee

app = angular.module('WebChat', []);
app.controller 'GroupController', ($scope) -> 

usercontroller.coffee

app = angular.module('WebChat', []);
app.controller 'UserController', ($scope) -> 

Ошибка

Ошибка: аргумент 'GroupController' не является функцией, получил undefined

Из документации я вообще не понимаю, что делает метод модуля. Сохраняет ли мой контроллер ключ "Webchat"?

Edit: Также кажется, что передача [] создает новый модуль и перезаписывает предыдущий

app = angular.module('WebChat', []);

Чтобы предотвратить это, вы должны оставить [] как

app = angular.module('WebChat');

Ответ 1

Проверьте другие места в коде, где вы ссылаетесь на "GroupController" (возможно, на вашем маршруте). Скорее всего, у вас это есть как переменная, но когда вы объявляете контроллер внутри модуля, вам придется обернуть его кавычками. EG:

MyCtrl1() = -> ()
...
$routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: MyCtrl1})

отлично работает, потому что MyCtrl1 является переменной. Но при объявлении контроллеров в модуле, как вы:

app = angular.module('WebChat', []);
app.controller 'GroupController', ($scope) ->
   # ...

$routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: 'GroupController'})

'GroupController' нуждается в котировках маршрута.

Ответ 2

вот что я сделал:

index.html

<script src="js/angular.js" type="text/javascript" charset="utf-8"></script>
<script src="js/myApp.js" type="text/javascript" charset="utf-8"></script>
<script src="js/myCtrlA.js" type="text/javascript" charset="utf-8"></script>
<script src="js/myCtrlB.js" type="text/javascript" charset="utf-8"></script>

app.js

myApp = angular.module('myApp', [])
myApp.config ($routeProvider) ->
    $routeProvider.when('/a', {controller: 'myCtrlA', templateUrl: 'a.html'})
    $routeProvider.when('/b', {controller: 'myCtrlB', templateUrl: 'b.html'})

myCtrlA.js

angular.module('myApp').controller 'myCtrlA', ($scope) ->
    console.log 'this is myCtrlA'

myCtrlB.js

angular.module('myApp').controller 'myCtrlB', ($scope) ->
    console.log 'this is myCtrlB'

как вы можете видеть, если у меня много файлов js контроллера, это будет много элементов script в index.html тоже.
Я еще не знаю, как с этим справиться.

FYI: http://briantford.com/blog/huuuuuge-angular-apps.html
но в этой статье также не упоминается файл html.

Ответ 3

У меня есть мое приложение var, определенное в моем файле app.js, на который сначала ссылаются, и после этого файлы контроллера, например FirstCtrl.js.

поэтому в app.js ex

var app = angular.module(...

в FirstCtrl.js

app.controller('FirstCtrl',

Ответ 4

Существует простое решение этой проблемы. Скомбинируйте свои файлы *. Coffee перед компиляцией. Если вы используете 'gulp', вы можете создать задачу следующим образом:

 gulp.src(['./assets/js/ng/**/*.coffee'])
    .pipe(concat('main.coffee'))
    .pipe(coffee())
    .pipe(ngmin())
    .pipe(gulp.dest('./public/static/js/app'))
    .pipe(livereload(server));

Например:

chat.coffee

myChat = angular.module 'myChat', []

msg.coffee

myChat
.directive 'message', () ->
    return {
        restrict: 'E'
        replace : true
        transclude: true
        scope: true
        template: '<div></div>' 
    }

После конкатенации и компиляции мы имеем:

(function () {
  var myChat;
  myChat = angular.module('myChat', []);
  myChat.directive('message', function () {
    return {
      restrict: 'E',
      replace: true,
      transclude: true,
      scope: true,
      template: '<div></div>'
    };
  });

}.call(this));

Наслаждайтесь!