Mi pregunta implica cómo tratar con el anidamiento complejo de plantillas (también llamadas parciales ) en una aplicación AngularJS.
La mejor manera de describir mi situación es con una imagen que creé:
Como puede ver, esto tiene el potencial de ser una aplicación bastante compleja con muchos modelos anidados.
La aplicación es de una sola página, por lo que carga un index.html que contiene un elemento div en el DOM con el ng-view
atributo.
Para el círculo 1 , verá que hay una navegación principal que carga las plantillas apropiadas en el ng-view
. Estoy haciendo esto pasando $routeParams
al módulo principal de la aplicación. Aquí hay un ejemplo de lo que hay en mi aplicación:
angular.module('myApp', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
when("/job/:jobId/zones/:zoneId", { controller: JobDetailController, templateUrl: 'assets/job_list_app/templates/zone_edit.html' }).
when("/job/:jobId/initial_inspection", { controller: JobDetailController, templateUrl: 'assets/job_list_app/templates/initial_inspection.html' }).
when("/job/:jobId/zones/:zoneId/rooms/:roomId", { controller: JobDetailController, templateUrl: 'assets/job_list_app/templates/room_edit.html' })
}]);
En el círculo 2 , la plantilla que se carga en el ng-view
tiene una subnavegación adicional . Este subnavegador necesita cargar plantillas en el área debajo de él, pero dado que ng-view ya se está utilizando, no estoy seguro de cómo hacerlo.
Sé que puedo incluir plantillas adicionales dentro de la primera plantilla, pero todas estas plantillas serán bastante complejas. Me gustaría mantener todas las plantillas separadas para que la aplicación sea más fácil de actualizar y no depender de la plantilla principal que debe cargarse para acceder a sus elementos secundarios.
En el círculo 3 , puedes ver que las cosas se vuelven aún más complejas. Existe la posibilidad de que las plantillas de subnavegación tengan una segunda subnavegación que también necesite cargar sus propias plantillas en el área del círculo 4
¿Cómo se puede estructurar una aplicación AngularJS para lidiar con un anidamiento tan complejo de plantillas y mantenerlas separadas entre sí?
fuente
Respuestas:
Bueno, dado que actualmente solo puede tener una directiva ngView ... utilizo controles de directiva anidados. Esto le permite configurar plantillas y heredar (o aislar) ámbitos entre ellos. Fuera de eso, uso ng-switch o incluso ng-show para elegir qué controles estoy mostrando en función de lo que viene de $ routeParams.
EDITAR Aquí hay un ejemplo de pseudocódigo para darle una idea de lo que estoy hablando. Con una navegación secundaria anidada.
Aquí está la página principal de la aplicación.
Directiva para la subnavegación
plantilla para la navegación secundaria
plantilla para una página principal (desde el navegador principal)
Controlador para una página principal. (desde el navegador principal)
Directiva para una subárea
fuente
ACTUALIZACIÓN: Echa un vistazo al nuevo proyecto de AngularUI para abordar este problema
Para subsecciones es tan fácil como aprovechar cadenas en ng-include:
O puede crear un objeto en caso de que tenga enlaces a subpáginas en todo el lugar:
O incluso puedes usar
$routeParams
También puede poner un controlador ng en el nivel superior de cada parcial
fuente
<div ng-include="'/home/' + tab + '.html'" ng-controller="SubCtrl"></div>
para usar un controlador / ámbito separado para la sub-plantilla. O simplemente especifique langController
directiva en cualquier lugar dentro de su (s) sub-plantilla (s) para usar un controlador diferente para cada parcial.Puede retirar esta biblioteca con el mismo propósito también:
http://angular-route-segment.com
Parece lo que está buscando, y es mucho más simple de usar que ui-router. Desde el sitio de demostración :
JS:
HTML de nivel superior:
HTML anidado:
fuente
Yo también estaba luchando con vistas anidadas en Angular.
Una vez que obtuve el enrutador ui, supe que nunca volvería a la funcionalidad de enrutamiento angular predeterminado.
Aquí hay una aplicación de ejemplo que usa múltiples niveles de anidamiento de vistas
Como se puede ver, hay 4 vistas principales (view1, view2, view3, view4) y view1 tiene 3 vistas secundarias.
fuente
$httpProvider
? No lo veo usado en ningún lado.Puede usar ng-include para evitar el uso de ng-views anidadas.
http://docs.angularjs.org/api/ng/directive/ngInclude
http://plnkr.co/edit/ngdoc:example-example39@snapshot?p=preview
Mi página de índice uso ng-view. Luego, en mis subpáginas que necesito tener marcos anidados. Yo uso ng-include. La demostración muestra un menú desplegable. Reemplacé el mío con un enlace ng-click. En la función, pondría $ scope.template = $ scope.templates [0]; o $ scope.template = $ scope.templates [1];
fuente
El enrutador ui angular admite vistas anidadas. Todavía no lo he usado, pero parece muy prometedor.
http://angular-ui.github.io/ui-router/
fuente