Complex nesting of partials and templates
我的问题涉及如何处理AngularJS应用程序中复杂的模板嵌套(也称为部分)。
描述我的情况的最佳方法是用我创建的图像:
正如您所看到的,这有可能是一个相当复杂的应用程序,有许多嵌套模型。
应用程序是单页的,因此它加载一个index.html,该index.html在具有
对于圆1,您可以看到有一个主导航,它将适当的模板加载到
1 2 3 4 5 6 7 8 | 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中,加载到
我知道我可以在第一个模板中包含其他模板,但是这些模板都会非常复杂。为了使应用程序更容易更新,并且不依赖于必须加载才能访问其子模板的父模板,我希望将所有模板分开。
在圈3中,你可以看到事情变得更加复杂。子导航模板可能会有第二个子导航,需要将其自己的模板以及加载到圆4中的区域中。
如何构建一个AngularJS应用程序来处理如此复杂的模板嵌套,同时保持它们彼此独立?
更新:查看Angularui的新项目以解决此问题
对于子部分,利用NG中的字符串非常简单,包括:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <ul id="subNav"> <li> Sub Page 1 </li> <li> Sub Page 2 </li> <li> Sub Page 3 </li> </ul> <ng-include src="subPage"></ng-include> |
或者您可以创建一个对象,以防您在整个地方都有指向子页面的链接:
1 | $scope.pages = { page1: 'section1/subpage1.htm', ... }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <ul id="subNav"> <li> Sub Page 1 </li> <li> Sub Page 2 </li> <li> Sub Page 3 </li> </ul> <ng-include src="pages[subPage]"></ng-include> |
或者你甚至可以使用EDOCX1[0]
1 2 3 | $routeProvider.when('/home', ...); $routeProvider.when('/home/:tab', ...); $scope.params = $routeParams; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <ul id="subNav"> <li> Sub Page 1 </li> <li> Sub Page 2 </li> <li> Sub Page 3 </li> </ul> <ng-include src=" '/home/' + tab + '.html'"></ng-include> |
您也可以在每个部分的最顶层放置一个NG控制器。
既然你现在只能有一个ngview指令…我使用嵌套的指令控件。这允许您设置模板并继承(或隔离)其中的作用域。除此之外,我使用ng开关,甚至仅使用ng-show,根据$routeparams的输入选择要显示的控件。
这里编辑一些伪代码示例,让您了解我在说什么。使用嵌套的子导航。
这是主应用程序页面
1 2 3 4 5 6 | <!-- primary nav --> Page 1 Page 2 Page 3 <!-- display the view --> |
子导航指令
1 2 3 4 5 6 7 8 9 10 11 | app.directive('mySubNav', function(){ return { restrict: 'E', scope: { current: '=current' }, templateUrl: 'mySubNav.html', controller: function($scope) { } }; }); |
子导航模板
1 2 3 | Sub Item 1 Sub Item 2 Sub Item 3 |
主页模板(来自主导航)
1 2 3 4 5 6 7 8 9 10 11 12 13 | <my-sub-nav current="sub"></my-sub-nav> <ng-switch on="sub"> <my-sub-area1></my-sub-area> <my-sub-area2></my-sub-area> <my-sub-area3></my-sub-area> </ng-switch> |
主页的控制器。(来自主导航)
1 2 3 | app.controller('page1Ctrl', function($scope, $routeParams) { $scope.sub = $routeParams.sub; }); |
子区域指令
1 2 3 4 5 6 7 8 9 | app.directive('mySubArea1', function(){ return { restrict: 'E', templateUrl: 'mySubArea1.html', controller: function($scope) { //controller for your sub area. } }; }); |
您也可以出于同样的目的签出此库:
网址:http://angular-route-segment.com
它看起来像您正在寻找的,而且比UI路由器更简单。从演示站点:
JS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | $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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <ul> <li ng-class="{active: $routeSegment.startsWith('s1')}"> Section 1 </li> <li ng-class="{active: $routeSegment.startsWith('s2')}"> Section 2 </li> </ul> |
嵌套HTML:
1 2 | <h4>Section 1</h4> Section 1 contents. |
我也在努力处理角度上的嵌套视图。
一旦我掌握了用户界面路由器,我就知道我再也不会回到角度默认的路由功能。
下面是一个使用多层视图嵌套的示例应用程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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=预览
我的索引页使用ng视图。然后在我的子页面上,我需要有嵌套的框架。我用ng include。演示显示下拉列表。我用一个链接替换了我的。在函数中,我将放置$scope.template=$scope.templates[0];或$scope.template=$scope.templates[1];
1 2 3 | $scope.clickToSomePage= function(){ $scope.template = $scope.templates[0]; }; |
AngularUI路由器支持嵌套视图。我还没用过,但看起来很有前途。
http://angular-ui.github.io/ui-router/