页面导航
    过去,一个URL代表一个页面。但是随着Ajax的兴起,情况发生的很大的变化。不同的内容可以使用同一个URL。这让浏览器中的回退、前进甚至收藏按钮都失去了作用。而AngularJS提供了一套解决方案能够避免这种情况。 怎么解决,有一个小技巧:浏览器不会因为URL中#符号后面的值改变而重新请求页面。(关于#符号,参见另一博文)
    现有如下RESTful的的URL:
        /admin/users/list
        /admin/users/new
        /admin/users/[id]
    我们可以把它们加载URL的#符号后面,就变成了(为了方便,把这种方式先称为hashbang)
        http://localhost/ebis#/admin/users/list
        http://localhost/ebis#/admin/users/new
        http://localhost/ebis#/admin/users/[id].
    浏览器其实是认识上面的URL的。并且认为他们是不同的(所有回退、前进按钮就可用了),但是又不会触发重新加载。
    好吧,万能的HTML5来了,他提供了一个history API可以处理如同
        http://localhost/ebis/admin/users/list
        http://localhost/ebis/admin/users/new
    的请求,并且还不会触发重新加载。(只是服务器端要经过设置)。
    现在AngularJS提供了一个服务,来兼容这两种方式,这就是$location。
    如下URL:
        http://localhost/ebis#/admin/users/list?active=true#bottom
    $location.url()   http://localhost/ebis
    $location.path()   /admin/users/list
    $location.search() {active:true}
    $location.hash()   bottom.
    上面四个方法当没有参数时是get方法;当有参数时是set方法。如$location.hash('top')。当然还有protocol(),host(),port(),absUrl()。这些只是get方法。
现在看看$location的具体应用,如下代码:
    <div ng-controller="TestController">
        <ul>
            <li><a href="#/admin/users/list">显示用户</a></li>
            <li><a href="#/admin/users/new">添加用户</a></li>
        </ul>
        <div ng-include="selectedRoute.templateUrl">
            <!--Route dependent content gose here -->
        </div>
    </div>
    当然必须还要有Controller
    function TestController($scope,$location){
        var routes={
                    "/admin/users/list":"pages/list.html",
                    "/admin/users/new":"pages/new.html"
                    };
        var defaultRoute=routes["/admin/users/list"];
        
        //仅有上面的还不够,我们还得加个监听器,随时监听URL的变化,就是先面的代码
        $scope.$watch(function(){
                                    return $location.path();
                                },function(newPath){
                                    $scope.selectedRoute=routes[newPath]||defaultRoute;
                                });
    }
    最后这个例子并不足够好,实际应用中也不会这么用。实际上我们会用另一个内置的service:$route
$route 和 $routeProvider
    (通过源码可发现,$route和$routeProvider似乎是一个东西) 在AngularJS配置阶段,可以用$routeProvider来配置Navigation,以实现和上面使用$location一样的功能,并且还会增强。
    angular.module('my-angu',[])
        .config(function($routeProvider){
            $routeProvider
                .when('/admin/users/list',{templateUrl:'pages/list.html',controller:'UsersController'})
                .when('/admin/users/new',{templateUrl:'pages/new.html',controller:'NewUserController'})
                .when('/admin/users/:id',{templateUrl:'pages/edit.html',controller:'EditorController'})
                .otherwise({redirectTo:'/admin/users/list'});
        });
    @PS:使用此方法,一旦配置,就不能再动态添加其他route了。因为AngularJS只config一次。
    页面HTML如下:
    <div ng-view>
    </div>
    对于Controller:
    .controller('UsersController',function($scope){
                    // logic here
                })
    .controller('NewUserController',function($scope){
                    // logic here
                })
    .controller('EditorController',function($scope,$routeParams){
                    var id=$routeParams.id
                    // logic here
                });
    注意到EditorController中注入了一个新的Service:$routeParams。 他就是用来获取URL中的参数设置。 我们设置的URL是'/admin/users/:id',那么如果请求'/admin/users/12',那么$routeParams.id=12.

页面转换
    我们可以有两种方式来进行页面转换:
    1.尽快显示新页面,当所需数据从Server返回后在刷新页面
    2.等所有数据都从Server返回并拼装到页面后,再显示页面
    AngularJS默认使用第一种。但是这会产生页面闪烁的问题。(因为短时间内刷新了两次)。所有AngularJS提供了方案使用第二种方式,
    如下:
    .when('/admin/users/:id',{
                                templateUrl:'pages/edit.html',
                                controller:'EditorController',
                                resolve:{
                                        user:function($route,Users){
                                                return Users.get($route.current.params.id);
                                             }
                                        }
                              })
    在EditorController中
    .controller('EditorController',function($scope,user){
                    $scope.user=user;
                });
    resolve中的属性function可以返回Javascript对象,还有promise。如果返回的是promise,AngularJS会等待promise resolve后才改变URL。
    那么还可以有如下代码:
        resolve:{
                delay:function($q,$timeout){
                        var delay = $q.defer();
                        $timeout(delay.resolve, 1000);
                         return delay.promise;
                     }
                }
    他的效果是一秒中后在改变URL。
$route的不足
    没法改变页面中多个地方的显示。只能改变ng-view所在的标签。没什么好的方法解决,只能凑活使用ng-include解决。
    没法递归使用:ng-view中没法再包含ng-view.

最后导航怎么少得了超链接
    <a ng-href='#/admin/users/list'></a> 这是hashbang方式.
    如果在配置阶段使用
    .config(function($locationProvider){
                $locationProvider.html5Mode(true);
            })
    打开了HTML5方式的URL模式,就使用
    <a ng-href='/admin/users/list'></a>

AngularJS(Part 10)--页面导航的更多相关文章

  1. WinPhone学习笔记(一)——页面导航与页面相关

    最近学一下Windows Phone(接下来简称“WinPhone”)的开发,在很久很久前稍探究一下WinPhone中对一些传感器的开发,那么现在就从头来学学WinPhone的开发.先从WinPhon ...

  2. 【Win10】页面导航的实现

    注:本文基于 Windows 10 10240 及其 SDK 编写,若以后有变化,请以新版本为准. 页面导航我们是再熟悉不过了,浏览器.手机 App 大多都使用这种方式来展示内容.在 Windows ...

  3. 与众不同 windows phone (27) - Feature(特性)之搜索的可扩展性, 程序的生命周期和页面的生命周期, 页面导航, 系统状态栏

    原文:与众不同 windows phone (27) - Feature(特性)之搜索的可扩展性, 程序的生命周期和页面的生命周期, 页面导航, 系统状态栏 [索引页][源码下载] 与众不同 wind ...

  4. 基于AngularJs的单页面程序

    基于AngularJs的单页面程序 在Abpzero的后台管理系统是一个AngularJs的单页面程序.当你登陆后,系统会跳转到"ApplicationController",然后 ...

  5. 使用QML自绘页面导航条

    使用QML自绘页面导航条 近期使用QML制作项目,依照要求.须要制作成分页的插件.遗憾的是,QML的控件库Qt Quick都没有现成的控件,于是我尝试着自己实现自绘页面导航条. 原创文章,反对未声明的 ...

  6. amazeui学习笔记--css(常用组件10)--导航条Topbar

    amazeui学习笔记--css(常用组件10)--导航条Topbar 一.总结 1. 导航条:就是页面最顶端的导航条:在容器上添加 .am-topbar class,然后按照示例组织所需内容.< ...

  7. windows phone8.1:页面导航详解

    小梦给大家带来windows phone 8.1应用开发实战教程,分享自己学习,开发过程中的经验和技巧. 今天给大家分享windows phone 8.1页面导航相关知识.涉及知识点如下: 页面一导航 ...

  8. WPF MvvmLight简单实例(1) 页面导航

    原文:WPF MvvmLight简单实例(1) 页面导航 实现了那些功能,先看看截图: 操作描述: 在程序运行后,点击“Load”按钮,页面会加载PageOne,点击PageOne页面中的“Next” ...

  9. wp8.1 页面返回 页面导航

    public The_second() public second() { this.InitializeComponent(); Frame frame = Window.Current.Conte ...

随机推荐

  1. iOS 基本数据类型 和 指针 特点

    基本数据类型 : 整型int, 字符型char , 浮点型 (float 和 double), 枚举型; -- 构造类型 : 数组类型, 结构体类型, 共用体类型; -- 指针类型 : 最终要的数据类 ...

  2. [MEF] 学习之一 入门级的简单Demo

    MEF 的精髓在于插件式开发,方便扩展. 我学东西,习惯性的先搞的最简单的Demo出来,看看有没有好玩的东东,然后继续深入.这个博文,不谈大道理,看demo说事儿. 至于概念,请google ,大把大 ...

  3. zabbix实现mysql数据库的监控(三)

    上面一章“zabbix实现mysql数据库的监控(二)”使用MPM来监控mysql,但是遇到安装问题始终解决不了,这里改用percona-monitoring-plugins进行zabbxi上监控my ...

  4. poj 3006 Dirichlet's Theorem on Arithmetic Progressions【素数问题】

    题目地址:http://poj.org/problem?id=3006 刷了好多水题,来找回状态...... Dirichlet's Theorem on Arithmetic Progression ...

  5. HDU 4055 Number String:前缀和优化dp【增长趋势——处理重复选数】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4055 题意: 给你一个由'I', 'D', '?'组成的字符串,长度为n,代表了一个1~n+1的排列中 ...

  6. 1.angular js 学习网址

    双向数据绑定: http://html-js.com/article/1863

  7. JavaWeb中文件的上传和下载

    JavaWeb中文件的上传和下载 转自: JavaWeb学习总结(五十)——文件上传和下载 - 孤傲苍狼 - 博客园https://www.cnblogs.com/xdp-gacl/p/4200090 ...

  8. 【python】关于函数递归使用 return 后,收到数据为 None。

    在写一个辗转相除求最小公因数的程序的时候,突然发现自己不管怎么写(除了两数恰巧可以整除),return 返回的值恒为 none. 代码为此: def gcd(a,b): if a%b==0: retu ...

  9. NYOJ--42--dfs水过||并查集+欧拉通路--一笔画问题

    dfs水过: /* Name: NYOJ--42--一笔画问题 Author: shen_渊 Date: 18/04/17 15:22 Description: 这个题用并查集做,更好.在练搜索,试试 ...

  10. Oracle修改字段名、字段数据类型

    语句:alter table tableName rename column oldCName to newCName; -- 修改字段名alter table tableName modify (c ...