AngularJS(Part 10)--页面导航
页面导航
过去,一个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)--页面导航的更多相关文章
- WinPhone学习笔记(一)——页面导航与页面相关
最近学一下Windows Phone(接下来简称“WinPhone”)的开发,在很久很久前稍探究一下WinPhone中对一些传感器的开发,那么现在就从头来学学WinPhone的开发.先从WinPhon ...
- 【Win10】页面导航的实现
注:本文基于 Windows 10 10240 及其 SDK 编写,若以后有变化,请以新版本为准. 页面导航我们是再熟悉不过了,浏览器.手机 App 大多都使用这种方式来展示内容.在 Windows ...
- 与众不同 windows phone (27) - Feature(特性)之搜索的可扩展性, 程序的生命周期和页面的生命周期, 页面导航, 系统状态栏
原文:与众不同 windows phone (27) - Feature(特性)之搜索的可扩展性, 程序的生命周期和页面的生命周期, 页面导航, 系统状态栏 [索引页][源码下载] 与众不同 wind ...
- 基于AngularJs的单页面程序
基于AngularJs的单页面程序 在Abpzero的后台管理系统是一个AngularJs的单页面程序.当你登陆后,系统会跳转到"ApplicationController",然后 ...
- 使用QML自绘页面导航条
使用QML自绘页面导航条 近期使用QML制作项目,依照要求.须要制作成分页的插件.遗憾的是,QML的控件库Qt Quick都没有现成的控件,于是我尝试着自己实现自绘页面导航条. 原创文章,反对未声明的 ...
- amazeui学习笔记--css(常用组件10)--导航条Topbar
amazeui学习笔记--css(常用组件10)--导航条Topbar 一.总结 1. 导航条:就是页面最顶端的导航条:在容器上添加 .am-topbar class,然后按照示例组织所需内容.< ...
- windows phone8.1:页面导航详解
小梦给大家带来windows phone 8.1应用开发实战教程,分享自己学习,开发过程中的经验和技巧. 今天给大家分享windows phone 8.1页面导航相关知识.涉及知识点如下: 页面一导航 ...
- WPF MvvmLight简单实例(1) 页面导航
原文:WPF MvvmLight简单实例(1) 页面导航 实现了那些功能,先看看截图: 操作描述: 在程序运行后,点击“Load”按钮,页面会加载PageOne,点击PageOne页面中的“Next” ...
- wp8.1 页面返回 页面导航
public The_second() public second() { this.InitializeComponent(); Frame frame = Window.Current.Conte ...
随机推荐
- HDU - 1175 连连看 【DFS】【BFS】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1175 思路 这种题一想到就用搜索, 但是内存是32m 用 bfs 会不会MLE 没错 第一次 BFS的 ...
- DNS 原理入门 (转)
DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作.我的目标是,读完此文后,你就能完全理解DNS. 一.D ...
- 苹果企业账号发布APP详解——通过自己网站分发应用
一.通过企业账号申请证书 1 Certificate Signing Request (CSR)文件 在Mac系统中进入“钥匙串访问”,选择“钥匙串访问”-“证书助理”-“从证书颁发机构请求证书…”, ...
- Spark Structured Streaming框架(1)之基本用法
Spark Struntured Streaming是Spark 2.1.0版本后新增加的流计算引擎,本博将通过几篇博文详细介绍这个框架.这篇是介绍Spark Structured Streamin ...
- 剑指offer——求1+2+...+n
方法一.通过在类的构造函数中执行加的过程. #include <iostream> using namespace std; class Base { public: Base(){n++ ...
- [java]final关键字、finally关键字与finalize()方法
final关键字: final关键字通常指的是“无法改变的”,使用“无法改变”这样修饰可能出于两个原因:设计或者效率. final可以修饰变量.方法和类. 一.final变量 一个既是static又是 ...
- LINQ 学习路程 -- 查询操作 Join
Join操作是将两个集合联合 Joining Operators Usage Join 将两个序列连接并返回结果集 GroupJoin 根据key将两个序列连接返回,像是SQL中的Left Join ...
- QT MVC 模型/视图
1. 模型视图实例一, QFileSystemModel QTreeView ,model/view示例. #include <QApplication> #include <QF ...
- JAVA- 切换默认的Java
删除自带的java yum remove java java -version发现还有java,因为电脑上安装了多个版本的java,这时我们可以用 yum groupremove java 通过组的这 ...
- leetcode 50. Pow(x, n)(快速幂)
就是一个二分法快速幂. 但是需要注意的问题是这里是实数,而且n可能为负.int的范围是-2,147,483,648 至 2,147,483,647.如果为-2,147,483,648那么直接n=-n就 ...