Tengo todos mis controladores AngularJS en un archivo, controllers.js. Este archivo está estructurado de la siguiente manera:
angular.module('myApp.controllers', [])
.controller('Ctrl1', ['$scope', '$http', function($scope, $http) {
}])
.controller('Ctrl2', ['$scope', '$http', function($scope, $http) }
}])
Lo que me gustaría hacer es poner Ctrl1 y Ctrl2 en archivos separados. Luego incluiría ambos archivos en mi index.html, pero ¿cómo debería estructurarse? Intenté hacer algo como esto y arroja un error en la consola del navegador web que dice que no puede encontrar mis controladores. ¿Alguna pista?
Busqué en StackOverflow y encontré esta pregunta similar; sin embargo, esta sintaxis está usando un marco diferente (CoffeeScript) además de Angular, por lo que no he podido seguirla.
fuente
appCtrl
es un globalwindow.appCtrl
. Esa no es una buena práctica.El uso de la API angular.module con una matriz al final le indicará a angular que cree un nuevo módulo:
myApp.js
Usarlo sin la matriz es en realidad una función getter. Entonces, para separar sus controladores, puede hacer:
Ctrl1.js
Ctrl2.js
Durante las importaciones de JavaScript, solo asegúrese de que myApp.js esté detrás de AngularJS pero antes de cualquier controlador / servicios / etc ... de lo contrario, angular no podrá inicializar sus controladores.
fuente
Aunque ambas respuestas son técnicamente correctas, quiero presentar una opción de sintaxis diferente para esta respuesta. Esta información facilita la lectura de lo que sucede con la inyección, la diferencia entre etc.
Archivo uno
Archivo dos
Archivo tres
fuente
¿Qué hay de esta solución? Módulos y controladores en archivos (al final de la página) Funciona con múltiples controladores, directivas, etc.
app.js
myCtrl.js
html
Google también tiene recomendaciones de mejores prácticas para la estructura angular de aplicaciones . Realmente me gusta agrupar por contexto. No todos los html en una carpeta, pero por ejemplo todos los archivos para iniciar sesión (html, css, app.js, controller.js, etc.). Entonces, si trabajo en un módulo, todas las directivas son más fáciles de encontrar.
fuente
Por brevedad, aquí hay una muestra de ES2015 que no se basa en variables globales
fuente
name
... así que simplemente puede usar enExampleCtrl.name
lugar de duplicar ... triplicarlo.No es tan elegante, pero es una solución de implementación muy simple: el uso de variables globales.
En el "primer" archivo:
en el "segundo", "tercero", etc.
fuente
angular.module('myApp').controller('ProductCtrl', ['$scope', '$http', function($scope, $http){ //Your ProductCtrl code goes here }]);