Сложная вложенность партиалов и шаблонов
мой вопрос включает в себя, как идти о решении сложных вложенности шаблоны (также называемый partials) в приложении AngularJS.
лучший способ описать мою ситуацию - это изображение, которое я создал:

как вы можете видеть, это может быть довольно сложное приложение с большим количеством вложенных моделей.
приложение одностраничное, поэтому оно загружает .HTML-код это содержит элемент div в DOM с
6 ответов:
Ну, так как в настоящее время вы можете иметь только одну директиву ngView... Я использую вложенные директивные элементы управления. Это позволяет настроить шаблоны и наследовать (или изолировать) области между ними. Вне этого я использую ng-switch или даже просто ng-show, чтобы выбрать, какие элементы управления я показываю на основе того, что поступает из $routeParams.
EDIT вот несколько примеров псевдо-кода, чтобы дать вам представление о том, о чем я говорю. С вложенных навигации.
здесь главная страница приложения
<!-- primary nav --> <a href="#/page/1">Page 1</a> <a href="#/page/2">Page 2</a> <a href="#/page/3">Page 3</a> <!-- display the view --> <div ng-view> </div>
обновление:Проверьте новый проект AngularUI для решения этой проблемы
для подразделов это так же просто, как использование строк в ng-include:
<ul id="subNav"> <li><a ng-click="subPage='section1/subpage1.htm'">Sub Page 1</a></li> <li><a ng-click="subPage='section1/subpage2.htm'">Sub Page 2</a></li> <li><a ng-click="subPage='section1/subpage3.htm'">Sub Page 3</a></li> </ul> <ng-include src="subPage"></ng-include>или вы можете создать объект, если у вас есть ссылки на подстраницы повсюду:
$scope.pages = { page1: 'section1/subpage1.htm', ... };<ul id="subNav"> <li><a ng-click="subPage='page1'">Sub Page 1</a></li> <li><a ng-click="subPage='page2'">Sub Page 2</a></li> <li><a ng-click="subPage='page3'">Sub Page 3</a></li> </ul> <ng-include src="pages[subPage]"></ng-include>или вы даже можете использовать
$routeParams$routeProvider.when('/home', ...); $routeProvider.when('/home/:tab', ...); $scope.params = $routeParams;<ul id="subNav"> <li><a href="#/home/tab1">Sub Page 1</a></li> <li><a href="#/home/tab2">Sub Page 2</a></li> <li><a href="#/home/tab3">Sub Page 3</a></li> </ul> <ng-include src=" '/home/' + tab + '.html' "></ng-include>вы также можете поставить ng-контроллер на самом верхнем уровне каждого частичный
вы можете проверить эту библиотеку для той же цели также:
http://angular-route-segment.com
похоже, что вы ищете, и это гораздо проще в использовании, чем ui-маршрутизатор. Из демо-сайте!--7-->:
JS:
$routeSegmentProvider. when('/section1', 's1.home'). when('/section1/:id', 's1.itemInfo.overview'). when('/section2', 's2'). segment('s1', { templateUrl: 'templates/section1.html', controller: MainCtrl}). within(). segment('home', { templateUrl: 'templates/section1/home.html'}). segment('itemInfo', { templateUrl: 'templates/section1/item.html', controller: Section1ItemCtrl, dependencies: ['id']}). within(). segment('overview', { templateUrl: 'templates/section1/item/overview.html'}).HTML верхнего уровня:
<ul> <li ng-class="{active: $routeSegment.startsWith('s1')}"> <a href="/section1">Section 1</a> </li> <li ng-class="{active: $routeSegment.startsWith('s2')}"> <a href="/section2">Section 2</a> </li> </ul> <div id="contents" app-view-segment="0"></div>вложенный HTML:
<h4>Section 1</h4> Section 1 contents. <div app-view-segment="1"></div>
Я тоже боролся с вложенными видами в Angular.
Как только я добрался до ui-router Я знал, что никогда не вернусь к угловой функции маршрутизации по умолчанию.
вот пример приложения, которое использует несколько уровней представления вложенности
app.config(function ($stateProvider, $urlRouterProvider,$httpProvider) { // navigate to view1 view by default $urlRouterProvider.otherwise("/view1"); $stateProvider .state('view1', { url: '/view1', templateUrl: 'partials/view1.html', controller: 'view1.MainController' }) .state('view1.nestedViews', { url: '/view1', views: { 'childView1': { templateUrl: 'partials/view1.childView1.html' , controller: 'childView1Ctrl'}, 'childView2': { templateUrl: 'partials/view1.childView2.html', controller: 'childView2Ctrl' }, 'childView3': { templateUrl: 'partials/view1.childView3.html', controller: 'childView3Ctrl' } } }) .state('view2', { url: '/view2', }) .state('view3', { url: '/view3', }) .state('view4', { url: '/view4', }); });Как видно, есть 4 основных вида (view1,view2,view3,view4) и view1 имеет 3 дочерних вида.
вы можете использовать ng-include, чтобы избежать использования вложенных ng-представлений.
http://docs.angularjs.org/api/ng/directive/ngInclude
http://plnkr.co/edit/ngdoc:example-example39@snapshot?p=previewмоя индексная страница я использую ng-view. Затем на моих подстраницах, которые мне нужно иметь вложенные кадры. Я использую ng-include. Демо показывает выпадающий список. Я заменил свой на ссылку ng-click. В функцию я бы поставил $scope.шаблон= $масштаб.шаблоны[0]; или $scope.template = $scope.шаблоны[1];
$scope.clickToSomePage= function(){ $scope.template = $scope.templates[0]; };
угловой пользовательского интерфейса маршрутизатора поддерживает вложенных представлений. Я еще не использовал его, но выглядит очень многообещающе.
Comments