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 相关文章推荐
js(JavaScript)实现TAB标签切换效果的简单实例
Feb 26 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
Jun 15 Javascript
javascript实现浏览器窗口传递参数的方法
Sep 03 Javascript
使用js画图之圆、弧、扇形
Jan 12 Javascript
jQuery获取table行数并输出单元格内容的实现方法
Jun 30 Javascript
详解PHP中pathinfo()函数导致的安全问题
Jan 05 Javascript
详解Sea.js中Module.exports和exports的区别
Feb 12 Javascript
关于JS与jQuery中的文档加载问题
Aug 22 jQuery
JavaScript实现页面中录音功能的方法
Jun 04 Javascript
layui 富文本赋值,取值,取纯文本值的实例
Sep 18 Javascript
Vue项目移动端滚动穿透问题的实现
May 19 Javascript
javascript this指向相关问题及改变方法
Nov 19 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
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
Angular 路由route实例代码
2016/07/12 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
手把手教你python实现SVM算法
2017/12/27 Python
Python xlrd excel文件操作代码实例
2020/03/10 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
毕业生自我鉴定
2013/11/05 职场文书
改进作风怎么办发言材料
2014/08/17 职场文书
先进事迹演讲稿
2014/09/01 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
在职证明范本
2015/06/15 职场文书
环境卫生标语
2015/08/03 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电
DIY胆机必读:各国电子管评价
2022/04/06 无线电