Angularjs路由需要了解的那点事

我们知道angularjs是特别适合单页面应用,为了通过单页面完成复杂的业务功能,势必需要能够从一个视图跳转到另外一个视图,也就是需要在单个页面里边加载不同的模板。为了完成这个功能angularjs为我们提供了路由服务($routeProvider)。

先看下我们的示例代码,html框架页index.html

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>angularjs路由示例</title>

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

  <script type="text/javascript">
    angular.element(document.getElementsByTagName(‘head‘)).append(angular.element(‘<base href="‘ + window.location.pathname + ‘" />‘));
  </script>
</head>
<body ng-app="ngRouteExample">
  <div ng-controller="MainController">
  Choose:
  <a href="Book/Moby">Moby</a> |
  <a href="Book/Moby/ch/1">Moby: Ch1</a> |
  <a href="Book/Gatsby">Gatsby</a> |
  <a href="Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a> |
  <a href="Book/Scarlet">Scarlet Letter</a><br/>

  <div ng-view></div>

  <hr />

  <pre>$location.path() = {{$location.path()}}</pre>
  <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>
  <pre>$route.current.params = {{$route.current.params}}</pre>
  <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>
  <pre>$routeParams = {{$routeParams}}</pre>
</div>
</body>
</html>

script.js文件的内容

(function(angular) {
  ‘use strict‘;
angular.module(‘ngRouteExample‘, [‘ngRoute‘])
 .controller(‘MainController‘, function($scope, $route, $routeParams, $location) {
     $scope.$route = $route;
     $scope.$location = $location;
     $scope.$routeParams = $routeParams;
    //  $scope.$on(‘$routeChangeSuccess‘, function(evt, next, previous) {
    //      debugger;
    //  });
 })

 .controller(‘BookController‘, function($scope, $routeParams) {
     $scope.name = "BookController";
     $scope.params = $routeParams;

 })

 .controller(‘ChapterController‘, function($scope, $routeParams) {
     $scope.name = "ChapterController";
     $scope.params = $routeParams;

 })

.config(function($routeProvider, $locationProvider) {
  $routeProvider
   .when(‘/Book/:bookId‘, {
    templateUrl: ‘book.html‘,
    controller: ‘BookController‘,
    resolve: {
      // I will cause a 1 second delay
      delay: function($q, $timeout) {
        var delay = $q.defer();
        $timeout(delay.resolve, 1000);
        return delay.promise;
      }
    }
  })
  .when(‘/Book/:bookId/ch/:chapterId‘, {
    templateUrl: ‘chapter.html‘,
    controller: ‘ChapterController‘
  });

  // configure html5 to get links working on jsfiddle
  $locationProvider.html5Mode(true);
});
})(window.angular);

book.html

controller: {{name}}<br />
Book Id: {{params.bookId}}<br />

chapter.html

controller: {{name}}<br />
Book Id: {{params.bookId}}<br />
Chapter Id: {{params.chapterId}}

一、为什么是单页应用

angularjs作为前端mvc框架,其页面中功能的切换势必得在URL上有所体现,但是其又不能刷新页面向服务器发送请求,因为每个请求需要对应服务器端的一个页面或者某个控制器的Action,也就是angularjs需要依赖服务器端的mvc框架,这样angularjs作为前端mvc框架就不那么纯粹了。

直接刷新angularjs的url,服务器找不到资源,具体效果如下

那怎么解决这个问题呢?这就需要服务器可以将这个路由重定向到index.html页面,并将/Book/Moby作为url参数返回,然后在页面中在路由到/Book/Moby即可。

二、页面初始化显示某个特定模板

一般情况下index.html是一个框架模板,不会包含具体的业务功能,具体页面效果如下

我们选中
Moby,在页面中间显示出来book.html的内容了,我们可以看到url地址已经变了,页面的效果如下

实际的开发中,我们往往不能只显示框架页index.html的内容,而是显示上图类似的效果,那我们怎么办呢?其实我们只需要页面加载完直接将原来的url切换为/Book/Moby即可,具体代码

 .controller(‘MainController‘, function($scope, $route, $routeParams, $location) {

$scope.$route = $route;

$scope.$location = $location;

$scope.$routeParams = $routeParams;

// $scope.$on(‘$routeChangeSuccess‘, function(evt, next, previous) {

// debugger;

// });

//控制器执行完毕,路由到/Book/Moby

$location.path("/Book/Moby");

})

三、无刷新切换路由

其实仔细想想,上边切换url是需要依赖无刷新切换路由的,即url变了,加载了相应的模板,但是框架模板页index.html却没有刷新。为了实现这个功能,angularjs针对新旧浏览器提供了两种方式,

针对老式浏览器可以使用标签模式,针对现代浏览器可以使用HTML5模式。

前者在URL中使用#来防止页面刷新,同时形成浏览器历史记录。具体形式如下

http://yoursite.com/#!/inbox/all

AngularJS支持的另外一种路由模式是
html5
模式。在这个模式中,URL看起来和普通的URL

一样(在老式浏览器中看起来还是使用标签的URL)。例如,同样的路由在HTML5模式中看起来

是这样的:

http://yoursite.com/inbox/all

在AngularJS内部,
$location 服务通过HTML5历史API让应用能够使用普通的URL路径来

路由。当浏览器不支持HTML5历史API时,
$location 服务会自动使用标签模式的URL作为替代

方案。

两者之间的切换通过$locationProvider.html5Mode进行切换。

时间: 2024-10-11 16:21:39

Angularjs路由需要了解的那点事的相关文章

angularjs 路由 $routeProvider

Angularjs路由描述:定义路由规则(routeProvider),然后通过不同的URL,告诉(ng-app)加载哪个页面(HTML),再渲染到(ng-app)视图(ng-view)中. 主界面index.html <!DOCTYPE html> <html> <head></head> <body> <div ng-app="routeApp"> <h3>路由</h3> <div

AngularJS路由系列(6)-- UI-Router的嵌套State

本系列探寻AngularJS的路由机制,在WebStorm下开发.本篇主要涉及UI-Route的嵌套State. 假设一个主视图上有两个部分视图,部分视图1和部分视图2,主视图对应着一个state,两个部分视图分别对应state1和state2,那state与state1和state2形成了嵌套关系. AngularJS路由系列包括: 1.AngularJS路由系列(1)--基本路由配置2.AngularJS路由系列(2)--刷新.查看路由,路由事件和URL格式,获取路由参数,路由的Resolv

AngularJS路由系列(5)-- UI-Router的路由约束、Resolve属性、路由附加数据、路由进入退出事件

本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● UI-Router约束路由参数● UI-Router的Resolve属性● UI-Router给路由附加数据● UI-Router的onEnter和onExit事件 AngularJS路由系列包括: 1.AngularJS路由系列(1)--基本路由配置2.AngularJS路由系列(2)--刷新.查看路由,路由事件和URL格式,获取路由参数,路由的Resolve3.AngularJS路由系列(3)-- UI-Rou

AngularJS路由系列(3)-- UI-Router初体验

本系列探寻AngularJS的路由机制,在WebStorm下开发. AngularJS路由系列包括: 1.AngularJS路由系列(1)--基本路由配置2.AngularJS路由系列(2)--刷新.查看路由,路由事件和URL格式,获取路由参数,路由的Resolve3.AngularJS路由系列(3)-- UI-Router初体验4.AngularJS路由系列(4)-- UI-Router的$state服务.路由事件.获取路由参数5.AngularJS路由系列(5)-- UI-Router的路由

angularjs路由path方式实现原理探究

angularjs路由 https://angular.io/guide/router 通过URL解释, 来定位客户端生成的浏览器端视图. 你可绑定路由到页面的链接上, 当用户点击链接, 可以浏览到相应的应用视图. The browser is a familiar model of application navigation: Enter a URL in the address bar and the browser navigates to a corresponding page. C

AngularJS 路由

AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 通过 AngularJS 可以实现多视图的单页Web应用(single page web application,SPA). 通常我们的URL形式为 http://runoob.com/first/page,但在单页Web应用中 AngularJS 通过 # + 标记 实现,例如: http://runoob.com/#/first http://runoob.com/#/second http://runoob.com/#/

AngularJS“多重路由”嵌套模块——AngularJS“路由”嵌套学习资料教程

这是小编的一些学习资料,理论上只是为了自己以后学习需要的,但是还是需要认真对待的 以下内容仅供参考,请慎重使用学习 1.AngularJS路由嵌套 Angularjs本身自带路由模块,可以满足通过不同的 URL 访问不同的内容,当然实际应用为在单页面点击不同按钮等加载不同页面 之前有关于angular-route路由的介绍,但是只能一层路由嵌套,如果需要多重嵌套就是不够用了 UI-Router作为AngularUI为开发者提供的其中实用的一个模块,根据URL状态组织和控制界面UI的渲染,不是仅仅

AngularJS路由和模板

前言 如果想开发一款类似gmail的web应用,我们怎么做呢? 以jQuery的思路,做响应式的架构设计时,我们要监听所有点击事件,通过事件函数触发我们加载数据,提交,弹框,验证等的功能:以 AngularJS的思路,做声明式的架构设计时,我们通过指令和路由先设定好,什么样的操作干什么事情,等事件发生时,程序就会知道该干什么了. 今天说一下,AngularJS是如何实现前端路由功能的! 目录 AngularJS路由介绍 路由的代码实现 实现效果截图 1. AngularJS路由介绍 Angula

【转】AngularJS路由和模板

1. AngularJS路由介绍 AngularJS路由功能是一个纯前端的解决方案,与我们熟悉的后台路由不太一样.后台路由,通过不同的URL会路由到不同的控制器上(controller),再渲染(render)到页面(HTML).AngularJS的前端路由,需求提前对指定的(ng-app),定义路由规则(routeProvider),然后通过不同的URL,告诉(ng-app)加载哪个页面(HTML),再渲染到(ng-app)视图(ng-view)中. AngularJS的前端路由,虽然URL输