AngularJS ui-router (嵌套路由)实例


Posted in Javascript onMarch 10, 2017

我们都知道,如果使用原生路由的话,Angular的视图是通过ng-view这个指令进行加载的。比如这样:<div ng-view></div>。一般,我们都会把这个指令放在index.html这个文件里面,然后,通过控制器来加载相应的模板视图。比如这样:

var bookStoreApp = angular.module('bookStoreApp', [ 
  'ngRoute', 'ngAnimate', 'bookStoreCtrls', 
]); 
bookStoreApp.config(function($routeProvider) { 
  $routeProvider.when('/hello', { 
    templateUrl: 'tpls/hello.html', 
    controller: 'HelloCtrl' 
  }).when('/list', { 
    templateUrl: 'tpls/bookList.html', 
    controller: 'BookListCtrl' 
  }).otherwise({ 
    redirectTo: '/hello' 
  }) 
});

这是属于AngularJS的原生路由定义。从表面上看似乎挺方便,没有什么太大的问题。但是细想一下,如果说我们有一个网页,左边是菜单栏,右边是各个菜单所对应的视图。那么,如果按照这样的定义,点击每个菜单项,岂不得刷新整个网页?而我们想要的只是右边的视图刷新。所以,这就要用到嵌套路由了。

所谓嵌套路由,就是视图里面还可以再嵌套视图,路由里还可以再嵌套路由。并且,通过ui-router,可以实现不同视图之间的参数传递。

ui-router定义路由的时候,与ngRouter不一样,它是使用.来进行定义的,并且在html标签里,不使用ng-view,而是使用ui-view,比如<div ui-view></div>。ui-router提供了$stateProvider,$urlRouterProvider来进行路由定义。

下面的实例演示如何实现路由嵌套:

home.html

创建如下的html页面:

<div class="jumbotron text-center"> 
  <h1>Home</h1> 
  <p>This page demonstrates 
    <span class="text-danger">nested</span>views. 
  </p> 
  <a ui-sref=".list" class="btn btn-primary">List</a> 
  <a ui-sref=".paragraph" class="btn btn-danger">Paragraph</a> 
</div> 
<div ui-view></div>

home-list.html

创建如下的html页面:

<ul> 
  <li ng-repeat="topic in topics">{{ topic }}</li> 
</ul>

about.html

创建如下的html页面:

<div class="jumbotron text-center"> 
  <h1>The About Page</h1> 
  <p>This page demonstrates 
    <span class="text-danger">multiple</span>and 
    <span class="text-danger">named</span>views.</p> 
</div> 
<div class="row"> 
  <div class="col-md-6"> 
    <div ui-view="columnOne"></div> 
  </div> 
  <div class="col-md-6"> 
    <div ui-view="columnTwo"></div> 
  </div> 
</div>

table-data.html

创建如下的html页面:

<h2>Ice-Creams</h2> 
<table class="table table-hover table-striped table-bordered"> 
  <thead> 
    <tr> 
      <td>Name</td> 
      <td>Cost</td> 
    </tr> 
  </thead> 
  <tbody> 
    <tr ng-repeat="topic in topics"> 
      <td>{{ topic.name }}</td> 
      <td>${{ topic.price }}</td> 
    </tr> 
  </tbody> 
</table>

注意,到目前为止,我们还没有插入任何AngularJS路由或者其它任何框架。目前我们只是创建了一些页面片段,我们需要一个占位或者说父页面来装下这些页面片段。让我们把这个页面叫做 index.html.

index.html

用如下内容创建这个html页面

<!doctype html> 
<html ng-app="routerApp"> 
<head> 
  <meta charset="utf-8"> 
  <link rel="stylesheet" href="css/bootstrap-3.0.0/css/bootstrap.css" rel="external nofollow" > 
  <script src="js/angular.min.js"></script> 
  <script src="js/angular-animate.js"></script> 
  <script src="js/angular-ui-router.js"></script> 
  <script src="app.js"></script> 
</head> 
<body> 
  <nav class="navbar navbar-inverse" role="navigation"> 
    <div class="navbar-header"> 
      <a class="navbar-brand" ui-sref="#">AngularUI Router</a> 
    </div> 
    <ul class="nav navbar-nav"> 
      <li> 
        <a ui-sref="home">Home</a> 
      </li> 
      <li> 
        <a ui-sref="about">About</a> 
      </li> 
    </ul> 
  </nav> 
  <div class="container"> 
    <div ui-view=""></div> 
  </div> 
</body> 
</html>

在主页中我们引入了angular.min.js、angular-ui-router.js、angular-animate.js和app.js。在class为Container的div中我们创建了一个<div ui-view=""></div>, 该 div 内的 HTML 内容会根据路由的变化而变化。在<a ui-sref="home"></a>中ui-sref 指令链接到特定状态。

在app.JS文件的内容,我们声明了AngularJS模块和路由配置。当页面加载的时候我们会在index.html中显示home.html的内容。代码如下:

var routerApp = angular.module('routerApp', ['ui.router']); 
routerApp.config(function($stateProvider, $urlRouterProvider) { 
  /*路由重定向 $urlRouterProvider:如果没有路由引擎能匹配当前的导航状态,那它就会默认将路径路由至 home.html, 
   *这个页面就是状态名称被声明的地方. */ 
  $urlRouterProvider.otherwise('/home'); 
  $stateProvider 
    .state('home', { 
      url: '/home', 
      templateUrl: 'tpls2/home.html' 
    }) 
   /* nested list with custom controller*/ 
  .state('home.list', { 
    url: '/list', 
    templateUrl: 'tpls2/home-list.html', 
    controller: function($scope) { 
      $scope.topics = ['Butterscotch', 'Black Current', 'Mango']; 
    } 
  }) 
  // nested list with just some random string data 
  .state('home.paragraph', { 
    url: '/paragraph', 
    template: 'I could sure use a scoop of ice-cream. ' 
  }) 
  .state('about', { 
    url: '/about', 
    /* view 用在该状态下有多个 ui-view 的情况,可以对不同的 ui-view 使用特定的 template, controller, resolve data 
     绝对 view 使用 '@' 符号来区别,比如 'columnOne@about' 表明名为 'columnOne' 的 ui-view 使用了 'about' 状态的 
     模板(template),相对 view 则无*/ 
    views: { 
      // 无名 view 
      '': { 
        templateUrl: 'tpls2/about.html' 
      }, 
      // for "ui-view='columnOne'" 
      'columnOne@about': { 
        template: '这里是第一列的内容' 
      }, 
      // for "ui-view='columnTwo'" 
      'columnTwo@about': { 
        templateUrl: 'tpls2/table-data.html', 
        controller: 'Controller' 
      } 
    } 
  }); 
}); 
routerApp.controller('Controller', function($scope) { 
  $scope.message = 'test'; 
  $scope.topics = [{ 
    name: 'Butterscotch', 
    price: 50 
  }, { 
    name: 'Black Current', 
    price: 100 
  }, { 
    name: 'Mango', 
    price: 20 
  }]; 
});

AngularJS ui-router (嵌套路由)实例

AngularJS ui-router (嵌套路由)实例

AngularJS ui-router (嵌套路由)实例

 AngularJS ui-router (嵌套路由)实例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 选择文件夹对话框(web)
Jul 07 Javascript
js word表格动态添加代码
Jun 07 Javascript
javascript权威指南 学习笔记之变量作用域分享
Sep 28 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
Sep 14 Javascript
jquery实现点击消失的代码
Mar 03 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
Dec 04 Javascript
浅析BootStrap Treeview的简单使用
Oct 12 Javascript
如何理解Vue的.sync修饰符的使用
Aug 17 Javascript
Vue.js自定义事件的表单输入组件方法
Mar 08 Javascript
jQuery实现table表格checkbox全选的方法分析
Jul 04 jQuery
js尾调用优化的实现
May 23 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
Jun 22 Javascript
微信小程序手势操作之单触摸点与多触摸点
Mar 10 #Javascript
Web纯前端“旭日图”实现元素周期表
Mar 10 #Javascript
微信小程序 MD5的方法详解及实例代码
Mar 10 #Javascript
jQuery实现扑克正反面翻牌效果
Mar 10 #Javascript
AngularJS之页面跳转Route实例代码
Mar 10 #Javascript
Angular多选、全选、批量选择操作实例代码
Mar 10 #Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
Mar 10 #Javascript
You might like
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
由Javascript实现的页面日历
2011/11/04 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
2013/04/16 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
JavaScript利用append添加元素报错的解决方法
2014/07/01 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
2017/10/13 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
2019/11/01 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
python爬虫中多线程的使用详解
2019/09/23 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
利用CSS3的checked伪类实现OL的隐藏显示的方法
2010/12/18 HTML / CSS
蛋白质世界:Protein World
2017/11/23 全球购物
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
继承公证书
2014/04/09 职场文书
植树节活动总结
2014/04/30 职场文书
经营管理策划方案
2014/05/22 职场文书
2014年学校德育工作总结
2014/12/05 职场文书
2015年党员发展工作总结
2015/05/13 职场文书
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android