angular路由
路由(route),几乎所有的MVC(VM)框架都应该具有的特性,因为它是前端构建单页面应用(SPA)必不可少的组成部分。
那么,对于angular而言,它自然也有内置的路由模块:叫做ngRoute。
不过,大家很少用它,因为它的功能太有限,往往不能满足开发需求!!
一个基于ngRoute开发的第三方路由模块,叫做ui.router,受到了大家的“追捧”。
ngRoute vs ui.router
首先,无论是使用哪种路由,作为框架额外的附加功能,它们都将以模块依赖的形式被引入,简而言之就是:在引入路由源文件之后,你的代码应该这样写(以ui.router为例):angular.module("myApp", ["ui.router"]); // myApp为自定义模块,依赖第三方路由模块ui.router
这样做的目的是:在程序启动(Angular)的时候,加载依赖模块(如:ui.router),将所有挂载在该模块的服务(provider),指令(directive),过滤器(filter)等都进行注册,那么在后面的程序中便可以调用了。
说到这里,就得看看ngRoute模块和ui.router模块各自都提供了哪些服务,哪些指令?
ngRoute
$routeProvider(服务提供者) ——— 对应于下面的urlRouterProvider和stateProvider
$route(服务) ——— 对应于下面的urlRouter和state
$routeParams(服务) ——— 对应于下面的stateParams
ng-view(指令) ——— 对应于下面的ui-view
ui.router
$urlRouterProvider(服务提供者) ——— 用来配置路由重定向
$urlRouter(服务)
$stateProvider(服务提供者) ——— 用来配置路由
$state(服务) ——— 用来显示当前路由状态信息,以及一些路由方法(如:跳转)
$stateParams(服务) ——— 用来存储路由匹配时的参数
ui-view(指令) ——— 路由模板渲染,对应的dom相关联
ui-sref(指令)
(注:服务提供者:用来提供服务实例和配置服务。)
这样一看,其实ui.router和ngRoute大体的设计思路,对应的模块划分都是一致的(毕竟是同一个团队开发),不同的地方在于功能点的实现和增强。
那么问题来了:ngRoute弱在哪些方面,ui.router怎么弥补了这些方面?
这里,列举两个最重要的方面来说(其他细节,后面再说):
多视图
嵌套视图
实例笔记
创建一个Angular模块(注册模块的过程)————myApp(是主要模块),并依赖注入ui.router模块
第一个是模板名(即应用名ng-app),第二个是依赖注入列表(数组)
需要注意的是这里的是 ui.router,而不是 ui-router
注册模板的方式有两种,第一种如下,这种方法注册的模板,
angularjs机制会新建一个模板,归根结底是不同的模版
var myApp = angular.module('helloworld' , ['ui.router']);
第二种是:var myApp = angular.module("helloworld");
如果应用程序中有了这个模板,那么就返回这个模板一样配置的模板,要注意的是,他们是同一个模板
实例化的模块有一个config的方法,通过它可以在模块跑起来之前做一些配置性工作,路由设置什么的就是在config中完成的。
config支持依赖注入(例如下面注入了$statueProvider),但是只有provider和constants是可以被注入进去的,其他的不可以。
//还可以把 $locationProvider也注入进来,逗号分隔
// 把 $locationProvider加进来的目的主要是希望在高级浏览器上是以html5Mode更改URL,
// 并且针对于IE8 9 这样的不支持的设置hashPrefix为“!”(默认html5Mode是false hashPrefix是'')。
//$urlRouterProvider这个是在没有匹配路由时,跳转默认路径
myApp.config(function($stateProvider,$urlRouterProvider){}
//配置路由状态的另一种写法
//myApp.config(['$stateProvider',function($stateProvider){
// ......
//}]);
//config方法 固定写法就是 app.config(function(){...})
//AngularJS模块可以在被加载和执行之前对模块自身进行配置。
//当你需要在AngularJS模块加载之前进行配置,就要用到config。
//只有提供者(Provider)和常量(constant)才能注入到config中。
//$statueProvider在配置块中注册了两个状态
//状态是UI路由器应用程序的基本构建块。这个javascript对象是一个简单的状态定义。
var helloState = {
//name和url并没有必须相同这一说法,是不同的两个东西
//这里的name对应的是ui-sref里的东西
name:'hello',
//当状态为活动状态时,浏览器的网址将会是/hello。
url:'/hello',
//该template:字符串定义状态的视图。当状态为活动状态时,此视图将被加载到视口中。
//还可以使用templateUrl,对应的值是html片段,例如:templateUrl:'artical.html'
template:'
return $ocLazyLoad.load(loaded, {serie: true});
}};
参数:
name:状态的名称。
stateConfig:状态配置对象。配置具有以下各项属性:
template: string/function,html模板字符串,或者一个返回html模板字符串的函数。
templateUrl:string/function,模板路径的字符串,或者返回模板路径字符串的函数。
templateProvider:function,返回html模板字符串或模板路径的服务。
controller:string/function,新注册一个控制器函数或者一个已注册的控制器的名称字符串。
controllerProvider:function,返回控制器或者控制器名称的服务
controllerAs:string,控制器别名。
parent:string/object,手动指定该状态的父级。
resolve:object,将会被注入controller去执行的函数,string,function>形式。
url:string,当前状态的对应url。
views:object,视图展示的配置。string,object>形式。
abstract:boolean,一个永远不会被激活的抽象的状态,但可以给其子级提供特性的继承。默认是true。
onEnter:function,当进入一个状态后的回调函数。
onExit:function,当退出一个状态后的回调函数。
reloadOnSearch:boolean,如果为false,那么当一个search/query参数改变时不会触发相同的状态,用于当你修改$location.search()的时候不想重新加载页面。默认为true。
data:object,任意对象数据,用于自定义配置。继承父级状态的data属性。换句话说,通过原型继承可以达到添加一个data数据从而整个树结构都能获取到。
params:url里的参数值,通过它可以实现页面间的参数传递。
ui.router源码解析
AngularJS ui-router (嵌套路由)
angular的uiRouter服务学习
$stateParams服务