Сложная вложенность партиалов и шаблонов



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



лучший способ описать мою ситуацию - это изображение, которое я создал:



AngularJS Page Diagram



как вы можете видеть, это может быть довольно сложное приложение с большим количеством вложенных моделей.



приложение одностраничное, поэтому оно загружает .HTML-код это содержит элемент div в DOM с

435   6  

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];
};

угловой пользовательского интерфейса маршрутизатора поддерживает вложенных представлений. Я еще не использовал его, но выглядит очень многообещающе.

http://angular-ui.github.io/ui-router/

Comments

    Ничего не найдено.