AngularJs ng-route路由详解及实例代码


Posted in Javascript onSeptember 14, 2016

前提

首先需要在页面引入angular和angular-route,注意要在angular-route之前引入angular

<script src="../../bower_components/angular/angular.js"></script>
<script src="../../bower_components/angular-route/angular-route.js"></script>

这主要是因为angular-route.js需要传入window.angular这个参数,而这个参数只有在加载完angular才会出现。

(function(window, angular, undefined) {
'use strict';
...
ngRouteModule.directive('ngView', ngViewFactory);
...
})(window, window.angular);

下载可以去官网下载,或者使用bower进行安装。

讲解

路由功能是由 routeProvider服务 和 ng-view 搭配实现,ng-view相当于提供了页面模板的挂载点,当切换URL进行跳转时,不同的页面模板会放在ng-view所在的位置; 然后通过 routeProvider 配置路由的映射。

一般主要通过两个方法:

when():配置路径和参数;

otherwise:配置其他的路径跳转,可以想成default。

when的第二个参数:

controller:对应路径的控制器函数,或者名称

controllerAs:给控制器起个别名

template:对应路径的页面模板,会出现在ng-view处,比如"<div>xxxx</div>"

templateUrl:对应模板的路径,比如"src/xxx.html"

resolve:这个参数着重说下,该属性会以键值对对象的形式,给路由相关的控制器绑定服务或者值。然后把执行的结果值或者对应的服务引用,注入到控制器中。如果resolve中是一个promise对象,那么会等它执行成功后,才注入到控制器中,此时控制器会等待resolve中的执行结果。

详细的例子,可以参考下面的样例。

redirectTo:重定向地址

reloadOnSearch:设置是否在只有地址改变时,才加载对应的模板;search和params改变都不会加载模板

caseInsensitiveMatch:路径区分大小写

路由有几个常用的事件:

$routeChangeStart:这个事件会在路由跳转前触发

$routeChangeSuccess:这个事件在路由跳转成功后触发

$routeChangeError:这个事件在路由跳转失败后触发

使用

在页面中,写入URL跳转的按钮链接 以及 ng-view标签  

<div ng-controller="myCtrl">
  <ul>
   <li><a href="#/a">click a</a></li>
   <li><a href="#/b">click b</a></li>
  </ul>

  <ng-view></ng-view>
  <!-- <div ng-view ></div> -->
 </div>

其中,ng-view可以当作元素或者标签等。

javascript中需要定义跳转的相关配置

<script type="text/javascript">
 angular.module("myApp",["ngRoute"])
 .controller("aController",function($scope,$route){
  $scope.hello = "hello,a!";
 })
 .controller("bController",function($scope){
  $scope.hello = "hello,b!";
 })
 .controller("myCtrl",function($scope,$location){

  $scope.$on("$viewContentLoaded",function(){
   console.log("ng-view content loaded!");
  });

  $scope.$on("$routeChangeStart",function(event,next,current){
   //event.preventDefault(); //cancel url change
   console.log("route change start!");
  });
 })
 .config(function($routeProvider, $locationProvider) {
   $routeProvider
   .when('/a', {
   templateUrl: 'a.html',
   controller: 'aController'
   })
  .when('/b', {
   templateUrl: 'b.html',
   controller: 'bController',
   resolve: {
     // I will cause a 3 second delay
     delay: function($q, $timeout) {
     var delay = $q.defer();
     $timeout(delay.resolve, 3000);
     return delay.promise;
     }
   }
  })
  .otherwise({
   redirectTo: '/a'
   });
 });
 </script>

上面的代码中,/b路径中的resolve关联来一个延迟方法,这个方法返回的时Promise对象,而且3秒钟后才会返回结果。因此b页面,在3秒后才会加载成功。

额外还需要提供两个html:

a.html:

<div ng-controller="aController" style="height:500px;width:100%;background-color:green;">{{hello}}</div>

以及b.html:

<div ng-controller="bController" style="height:2500px;width:100%;background-color:blue;">{{hello}}</div>

这样,就可以实现路由的跳转了。

全部的代码可以参考:

<html ng-app="myApp">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <script src="../../bower_components/angular/angular.js"></script>
 <script src="../../bower_components/angular-route/angular-route.js"></script>
</head>
<body>
 <div ng-controller="myCtrl">
  <ul>
   <li><a href="#/a">click a</a></li>
   <li><a href="#/b">click b</a></li>
  </ul>

  <ng-view></ng-view>
  <!-- <div ng-view ></div> -->
 </div>
 <script type="text/javascript">
 angular.module("myApp",["ngRoute"])
 .controller("aController",function($scope,$route){
  $scope.hello = "hello,a!";
 })
 .controller("bController",function($scope){
  $scope.hello = "hello,b!";
 })
 .controller("myCtrl",function($scope,$location){

  $scope.$on("$viewContentLoaded",function(){
   console.log("ng-view content loaded!");
  });

  $scope.$on("$routeChangeStart",function(event,next,current){
   //event.preventDefault(); //cancel url change
   console.log("route change start!");
  });
 })
 .config(function($routeProvider, $locationProvider) {
   $routeProvider
   .when('/a', {
   templateUrl: 'a.html',
   controller: 'aController'
   })
  .when('/b', {
   templateUrl: 'b.html',
   controller: 'bController',
   resolve: {
     // I will cause a 1 second delay
     delay: function($q, $timeout) {
     var delay = $q.defer();
     $timeout(delay.resolve, 3000);
     return delay.promise;
     }
   }
  })
  .otherwise({
   redirectTo: '/a'
   });
 });
 </script>
</body>
</html>

以上就是对AngularJS  ng-route路由的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
HTML 自动伸缩的表格Table js实现
Apr 01 Javascript
使用jQuery模板来展现json数据的代码
Oct 22 Javascript
javascript闭包的高级使用方法实例
Jul 04 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
Jul 09 Javascript
angularJS 中$scope方法使用指南
Feb 09 Javascript
在页面中输出当前客户端时间javascript实例代码
Mar 02 Javascript
基于javascript数组实现图片轮播
May 02 Javascript
PHP捕捉异常中断的方法
Oct 24 Javascript
js移动焦点到最后位置的简单方法
Nov 25 Javascript
如何获取元素的最终background-color
Feb 06 Javascript
通过实例学习React中事件节流防抖
Jun 17 Javascript
js实现批量删除功能
Aug 27 Javascript
js实现文字截断功能
Sep 14 #Javascript
jQuery版AJAX简易封装代码
Sep 14 #Javascript
原生JS实现首页进度加载动画
Sep 14 #Javascript
jquery判断iPhone、Android设备类型
Sep 14 #Javascript
Angularjs 实现分页功能及示例代码
Sep 14 #Javascript
Angularjs CURD 详解及实例代码
Sep 14 #Javascript
Angular Module声明和获取重载实例代码
Sep 14 #Javascript
You might like
CI框架常用方法小结
2016/05/17 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
jQuery操作 input type=checkbox的实现代码
2012/06/14 Javascript
js导出txt示例代码
2014/01/14 Javascript
jQuery的$.proxy()应用示例介绍
2014/04/03 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
jquery单行文字向上滚动效果的实现代码
2014/09/05 Javascript
JS实现的表格行鼠标点击高亮效果代码
2015/11/27 Javascript
js中flexible.js实现淘宝弹性布局方案
2020/06/23 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
2018/09/12 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
python获取标准北京时间的方法
2015/03/24 Python
python入门教程之识别验证码
2017/03/04 Python
Python内置函数reversed()用法分析
2018/03/20 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
总结python中pass的作用
2019/02/27 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
Python程序暂停的正常处理方法
2019/11/07 Python
python对文件的操作方法汇总
2020/02/28 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
2020/11/20 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
酒吧总经理岗位职责
2013/12/10 职场文书
个人授权委托书范本格式
2014/10/12 职场文书
党员个人整改措施
2014/10/24 职场文书
网聊搭讪开场白
2015/05/28 职场文书
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技