Мой вопрос состоит в том, как решить сложную вложение шаблонов (также называемых частичными ) в приложении AngularJS.
Лучший способ описать мою ситуацию с помощью изображения, которое я создал:
Как видите, это может быть довольно сложным приложением с множеством вложенных моделей.
Приложение является одностраничным, поэтому оно загружает index.html, который содержит элемент div в DOM с ng-view
атрибутом.
Для круга 1 вы видите, что есть основная навигация, которая загружает соответствующие шаблоны в ng-view
. Я делаю это, переходя $routeParams
к основному модулю приложения. Вот пример того, что в моем приложении:
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' })
}]);
В кружке 2 шаблон, который загружен в, ng-view
имеет дополнительную суб-навигацию . Затем эта под-навигация должна загрузить шаблоны в область под ней - но так как ng-view уже используется, я не уверен, как это сделать.
Я знаю, что могу включить дополнительные шаблоны в 1-й шаблон, но все эти шаблоны будут довольно сложными. Я хотел бы хранить все шаблоны отдельно, чтобы облегчить обновление приложения и не зависеть от родительского шаблона, который необходимо загрузить для доступа к его дочерним элементам.
В круге 3 вы можете увидеть, что все становится еще сложнее. Существует вероятность того, что шаблоны суб-навигации будут иметь 2-ю суб-навигацию , которая должна будет загружать свои собственные шаблоны также в область в круге 4
Как можно структурировать приложение AngularJS, чтобы справиться с таким сложным вложением шаблонов, сохраняя их все отдельно друг от друга?
источник
Ответы:
Ну, поскольку в настоящее время вы можете иметь только одну директиву ngView ... Я использую вложенные элементы управления директивами. Это позволяет вам устанавливать шаблоны и наследовать (или изолировать) области действия между ними. Помимо этого я использую ng-switch или даже просто ng-show, чтобы выбрать, какие элементы управления я отображаю, основываясь на том, что поступает из $ routeParams.
РЕДАКТИРОВАТЬ Вот несколько примеров псевдокода, чтобы дать вам представление о том, о чем я говорю. С вложенной суб-навигацией.
Вот главная страница приложения
Директива для суб-навигации
шаблон для суб-навигации
шаблон для главной страницы (из первичной навигации)
Контроллер для главной страницы. (из первичной навигации)
Директива для подзоны
источник
ОБНОВЛЕНИЕ: Проверьте новый проект AngularUI для решения этой проблемы
Для подразделов это так же просто, как использовать строки в ng-include:
Или вы можете создать объект, если у вас есть ссылки на подстраницы повсюду:
Или вы можете даже использовать
$routeParams
Вы также можете поместить ng-контроллер на самый верхний уровень каждого частичного
источник
<div ng-include="'/home/' + tab + '.html'" ng-controller="SubCtrl"></div>
, чтобы использовать отдельный контроллер / область для подшаблона. Или просто укажитеngController
директиву в любом месте вашего под-шаблона (ов), чтобы использовать разные контроллеры для каждого частичного.Вы можете также проверить эту библиотеку для той же цели:
http://angular-route-segment.com
Похоже, что вы ищете, и это гораздо проще в использовании, чем UI-маршрутизатор. С демо-сайта :
JS:
HTML верхнего уровня:
Вложенный HTML:
источник
Я тоже боролся с вложенными представлениями в Angular.
Как только я овладел ui-router, я понял, что никогда не вернусь к функциям угловой маршрутизации по умолчанию.
Вот пример приложения, которое использует несколько уровней вложенности представлений
Как видно, существует 4 основных вида (view1, view2, view3, view4), а view1 имеет 3 дочерних вида.
источник
$httpProvider
? Я не вижу его нигде.Вы можете использовать ng-include, чтобы избежать использования вложенных ng-views.
http://docs.angularjs.org/api/ng/directive/ngInclude
http://plnkr.co/edit/ngdoc:example-example39@snapshot?p=preview
Моя страница индекса я использую ng-view. Затем на моих подстраницах, которые мне нужно иметь вложенные рамки. Я использую нг-включить. Демо показывает раскрывающийся список. Я заменил мой со ссылкой нг-клик. В функции я бы поместил $ scope.template = $ scope.templates [0]; или $ scope.template = $ scope.templates [1];
источник
Angular ui-router поддерживает вложенные представления. Я еще не использовал его, но выглядит очень многообещающе.
http://angular-ui.github.io/ui-router/
источник