2012-09-29 24 views
24

Estoy tratando de dividir mis controladores en varios archivos, pero cuando intento para registrarlos en mi módulo im conseguir un error:AngularJS: ¿Cómo puedo crear controladores en varios archivos

groupcontroller.coffee

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

usercontroller.coffee

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

error

error: Argumento 'GroupController' no es una función, consiguió sin definir

De la documentación que realmente no conseguir lo que hace el método del módulo de todos modos. ¿Almacena mi controlador con la clave 'Webchat'?

Editar: También parece que pasa [] crea un nuevo módulo y sobrescribe la anterior

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

Para evitar esto, usted tiene que dejar de lado el [] como

app = angular.module('WebChat'); 
+7

+1 para la edición que explica pasar '[]' ya que el segundo argumento del método del módulo sobrescribe el anterior. – semperos

+0

@ user1703761: ¡Gracias, amigo! +1 para la edición. –

Respuesta

6

Consulte otros lugares en el código donde hace referencia a 'GroupController' (probablemente en su ruta). Lo más probable es que lo tenga como una variable, pero cuando declare un controlador dentro de un módulo, tendrá que ajustarlo. EG:

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

funciona bien porque MyCtrl1 es una variable. Pero cuando se declara controladores en un módulo como eres:

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

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

'GroupController' necesita cotizaciones en la ruta.

+0

Gracias, eso resolvió el problema – user1703761

13

aquí es lo que hice:

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' 

como puede ver, si tengo muchos archivos js de controlador, que también incluirán muchos elementos de script en index.html.
No sé cómo lidiar con eso todavía.

FYI: http://briantford.com/blog/huuuuuge-angular-apps.html
pero este artículo tampoco mencionó el archivo html.

+2

El orden en la página html es importante, estaba construyendo un archivo js con grunt y concat, pero obtuve el error de que no se encontró el módulo xy, después de poner la declaración angular.module en 1er lugar todo funciona bien :-). – Sebastian

3

Tengo mi aplicación definida en mi aplicación.Se hace referencia a la primera vez que se hace referencia al archivo js, ​​y luego el controlador archiva, por ejemplo, FirstCtrl.js.

por lo que en app.js ex

var app = angular.module(... 

en FirstCtrl.js

app.controller('FirstCtrl', 
0

hay una solución simple a este problema. Concatene sus archivos * .coffee antes de compilar. Si utiliza 'trago' puede crear tarea como esta:

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

Por ejemplo:

chat.coffee

myChat = angular.module 'myChat', [] 

msg.coffee

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

Después de concatenar y compilar tenemos:

(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)); 

¡Disfrútalo!

Cuestiones relacionadas