angularJS——路由

一个应用是由若个视图组合而成的,根据不同的业务逻辑展示给用户不同的视图,路由则是实现这一功能的关键。

SPA

SPA(Single Page Application)指的是通过单一页面展示所有功能,通过Ajax动态获取数据然后进行实时渲染,结合CSS3动画模仿原生App交互,然后再进行打包(使用工具把Web应用包一个壳,这个壳本质上是浏览器)变成一个“原生”应用。
在PC端也有广泛的应用,通常情况下使用Ajax异步请求数据,然后实现内容局部刷新,局部刷新的本质是动态生成DOM,新生成的DOM元素并没有真实存在于文档中,所以当再次刷新页面时新添加的DOM元素会“丢失”,通过单页面应可以很好的解决这个问题。

路由

在后端开发中通过URL地址可以实现页面(视图)的切换,但是AngularJS是一个纯前端MVC框架,在开发单页面应用时,所有功能都在同一页面完成,所以无需切换URL地址(即不允许产生跳转),但Web应用中又经常通过链接(a标签)来更新页面(视图),当点击链接时还要阻止其向服务器发起请求,通过锚点(页内跳转)可以实现这一点。
实现单页面应用需要具备:
a、只有一页面
b、链接使用锚点

<div class="wrapper">
        <!-- 导航菜单 -->
        <ul>
            <li class="active">
                <a href="#index">Index</a>
            </li>
            <li>
                <a href="#introduce">Introduce</a>
            </li>
            <li>
                <a href="#contact">Contact Us</a>
            </li>
        </ul>
        <!-- 内容 -->
        <div class="content">
            Index Page
        </div>
    </div>
    <script>

        // 监听锚点变化然后发送请求
        // hashchange事件可以监听锚点变化
        window.addEventListener('hashchange', function () {
            // 获取锚点
            var hash = location.hash;
            // 处理#
            hash = hash.slice(1);

            // 实例对象
            var xhr = new XMLHttpRequest;

            // 将锚点做为参数传递给服务端进处理
            xhr.open('get', '10-01.php?hash=' + hash);

            xhr.send(null);

            xhr.onreadystatechange = function () {
                if(xhr.readyState == 4 && xhr.status == 200) {
                    var result = xhr.responseText;
                    // 将返回结果添加到页面
                    document.querySelector('.content').innerHTML = result;
                }
            }
        });

    </script>

通过上面的例子发现在单一页面中可以能过hashchange事件监听到锚点的变化,进而可以实现为不同的锚点准不同的视图,单页面应用就是基于这一原理实现的。
AngularJS对这一实现原理进行了封装,将锚点的变化封装成路由(Route),这是与后端路由的根本区别。
在1.2版前路由功能是包含在AngularJS核心代码当中,之后的版本将路由功能独立成一个模块,下载angular-route.js

使用

1、引入angular-route.js

2、实例化模块(App)时,当成依赖传进去(模块名称叫ngRoute)。

var app = angular.module('app',['ngRoute']);

3、配置路由模块

app.config(['$routeProvider',function($routeProvider){
    $routeProvider.when('/',{
        templete:'首页';
    });
}]);

4、布局模板
通过ng-view指令布局模板,路由匹配的视图会被加载渲染到些区域。

<header>头部</header>
<div class = "container">
    <div ng-view></div>
</div>
<footer>底部</footer>

路由参数

1、提供两个方法匹配路由,分别是when和otherwise,when方法需要两个参数,otherwise方法做为when方法的补充只需要一个参数,其中when方法可以被多次调用。

// 依赖ngRoute模块
        var App = angular.module('App', ['ngRoute']);

        // 需要对路由模块进行配置,使其正常工作
        App.config(['$routeProvider', function ($routeProvider) {

            $routeProvider.when('/index', {
                // template: '<h1>index Pages!</h1>',
                templateUrl: './abc.html'
            })
            .when('/introduce', {
                template: '<h1>introduce Pages!</h1>'
            })
            .when('/contact', {
                // template: '<h1>contact US Pages!</h1>',
                templateUrl: './contact.html',
                controller: 'ContactController' // 定义控制器
            })
            .when('/list', {
                templateUrl: './list.html', // 视图模板
                controller: 'ListController' // 定义控制器
            })
            .otherwise({
                redirectTo: '/index'
            });

        }]);

第1个参数是一个字符串,代表当前URL中的hash值。
第2个参数是一个对象,配置当前路由的参数,如视图、控制器等。
a、template 字符串形式的视图模板
b、templateUrl 引入外部视图模板
c、controller 视图模板所属的控制器
d、redirectTo跳转到其它路由
4、获取参数,在控制中注入$routeParams可以获取传递的参数

// 提供了一个专门负责获取参数的一个服务$routeParams
        App.controller('IndexController', ['$scope', '$http', '$routeParams', function ($scope, $http, $routeParams) {

            $scope.content = '练习路由功能';

            console.log($routeParams);

        }]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值