ngRoute路由改变监听事件(1)+ui.router状态路由
来源:互联网 发布:淘宝主播怎么做 编辑:程序博客网 时间:2024/06/01 09:58
1.1、路由改变监听事件(1)
1、$routeChangeStart:路由开始切换
2、$routeChangeSuccess:路由切换成功
3、$routeChangeError:路由切换失败(比如resolve中有错误),都会导致路由切换失败
4、$locationChangeStart:当$location.path或$location.url发生变化时触发
5、$locationChangeSuccess:当$location.path或$location.url发生成功后触发
例子:
angular.module('myApp',['ngRoute'])
.config(['$routeProvider',function ($routeProvider) {
$routeProvider
.when('/home',{
templateUrl: 'home.html',
controller: 'HomeController',
/**
* 该属性的特点:列表(对象中的key值)可以注入到控制器中使用,
* 如果key值为字符串,那么服务名必须是字符串,
* 如果是函数,那么服务名必须是函数参数
*/
// resolve: {
// //这里的b值必须是服务的名字
// a: 'b'
// }
})
.when('/other',{
templateUrl: 'other.html',
controller: 'OtherController'
})
.otherwise('/home');
}])
.run(['$rootScope',function ($rootScope) {
//路由开始切换
/**
* args[0]: 事件
* args[1]: 要切换的路由
* args[2]: 第一次进入该方法,没有当前路由,为undefined
*/
$rootScope.$on('$routeChangeStart',function (event,next,current) {
console.log([event,next,current]);
});
//路由切换成功
/**
* args[0]: 事件
* args[1]: 当前的路由
* args[2]: 上一个路由,第一次进入该方法,没有上一个路由,为undefined
*/
$rootScope.$on('$routeChangeSuccess',function (event,current,previous) {
console.log([event,current,previous]);
});
//路由切换失败(比如resolve中有错误等待),都会导致路由切换失败
$rootScope.$on('$routeChangeError',function (event,msg) {
console.log([event,msg]);
});
//当$location.path发生变化或者$location.url发生变化时触发
$rootScope.$on('$locationChangeStart',function (event,msg) {
console.log([event,msg]);
});
//当且仅当path或url变化成功后触发
$rootScope.$on('$locationChangeSuccess',function (event,msg) {
console.log([event,msg]);
});
}])
.controller('HomeController',['$scope','$location',function ($scope,$location) {
$scope.toOtherView = function () {
$location.path('/other');
}
}])
.controller('OtherController',['$scope','$location',function ($scope,$location) {
$scope.toHomeView = function () {
$location.path('/home');
}
}]);
.config(['$routeProvider',function ($routeProvider) {
$routeProvider
.when('/home',{
templateUrl: 'home.html',
controller: 'HomeController',
/**
* 该属性的特点:列表(对象中的key值)可以注入到控制器中使用,
* 如果key值为字符串,那么服务名必须是字符串,
* 如果是函数,那么服务名必须是函数参数
*/
// resolve: {
// //这里的b值必须是服务的名字
// a: 'b'
// }
})
.when('/other',{
templateUrl: 'other.html',
controller: 'OtherController'
})
.otherwise('/home');
}])
.run(['$rootScope',function ($rootScope) {
//路由开始切换
/**
* args[0]: 事件
* args[1]: 要切换的路由
* args[2]: 第一次进入该方法,没有当前路由,为undefined
*/
$rootScope.$on('$routeChangeStart',function (event,next,current) {
console.log([event,next,current]);
});
//路由切换成功
/**
* args[0]: 事件
* args[1]: 当前的路由
* args[2]: 上一个路由,第一次进入该方法,没有上一个路由,为undefined
*/
$rootScope.$on('$routeChangeSuccess',function (event,current,previous) {
console.log([event,current,previous]);
});
//路由切换失败(比如resolve中有错误等待),都会导致路由切换失败
$rootScope.$on('$routeChangeError',function (event,msg) {
console.log([event,msg]);
});
//当$location.path发生变化或者$location.url发生变化时触发
$rootScope.$on('$locationChangeStart',function (event,msg) {
console.log([event,msg]);
});
//当且仅当path或url变化成功后触发
$rootScope.$on('$locationChangeSuccess',function (event,msg) {
console.log([event,msg]);
});
}])
.controller('HomeController',['$scope','$location',function ($scope,$location) {
$scope.toOtherView = function () {
$location.path('/other');
}
}])
.controller('OtherController',['$scope','$location',function ($scope,$location) {
$scope.toHomeView = function () {
$location.path('/home');
}
}]);
1.2、切换路由时,控制器会被销毁,控制器会痛过$broadcast传播一个名字为$destory的消息,在自己的作用域中可以监听到此消息,在控制器中我们可以做一些清理工作,比如关闭一些定时器等
例子:
angular.module('myApp',['ngRoute'])
.config(['$routeProvider',function ($routeProvider) {
$routeProvider
.when('/home',{
templateUrl: 'home.html',
controller: 'HomeController'
})
.when('/other',{
templateUrl: 'other.html',
controller: 'OtherController'
})
.otherwise('/home');
}])
.run(['$rootScope',function ($rootScope) {
}])
.controller('HomeController',['$scope','$location',function ($scope,$location) {
$scope.toOtherView = function () {
$location.path('/other');
}
}])
.controller('ChildController',['$scope','$interval',function ($scope,$interval) {
$scope.num = 0;
var interval = $interval(function () {
$scope.num++;
console.log(num);
},1000);
/**
* 切换路由时,控制器会被销毁
* 控制器会通过$broadcast传播一个名字为$destroy的消息
* 在自己的作用域中可以监听到这则消息,在控制器中我们就可以做一些清理工作,比如关闭定时器等
*/
$scope.$on('$destroy',function () {
console.log('父控制器死了');
$interval.cancel(interval);
});
}])
.controller('OtherController',['$scope','$location',function ($scope,$location) {
$scope.toHomeView = function () {
$location.path('/home');
}
}]);
.config(['$routeProvider',function ($routeProvider) {
$routeProvider
.when('/home',{
templateUrl: 'home.html',
controller: 'HomeController'
})
.when('/other',{
templateUrl: 'other.html',
controller: 'OtherController'
})
.otherwise('/home');
}])
.run(['$rootScope',function ($rootScope) {
}])
.controller('HomeController',['$scope','$location',function ($scope,$location) {
$scope.toOtherView = function () {
$location.path('/other');
}
}])
.controller('ChildController',['$scope','$interval',function ($scope,$interval) {
$scope.num = 0;
var interval = $interval(function () {
$scope.num++;
console.log(num);
},1000);
/**
* 切换路由时,控制器会被销毁
* 控制器会通过$broadcast传播一个名字为$destroy的消息
* 在自己的作用域中可以监听到这则消息,在控制器中我们就可以做一些清理工作,比如关闭定时器等
*/
$scope.$on('$destroy',function () {
console.log('父控制器死了');
$interval.cancel(interval);
});
}])
.controller('OtherController',['$scope','$location',function ($scope,$location) {
$scope.toHomeView = function () {
$location.path('/home');
}
}]);
2.1、ui.router状态路由
要下载angular-ui-router.js后引入方可使用
痛过$stateProvider与$urlRouterProvider两个服务使用
$stateProvider服务中有state属性选择状态变化
$urlRouterProvider服务为其他情况下的壮态(意外跳转)
例子:
angular.module('myApp',['ui.router'])
.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) {
$stateProvider
/**
* 第一个参数是状态,不是路由,一般情况下名字和路由名字一样
*
* ui-router是ng-route的一个升级版,基于状态机来组织接口,而不是简单的URL,基于ngRoute的,
* 能否完成一些场景的功能(有很多优秀的特性,比如ui-view嵌套,ngRoute无法实现ui-view嵌套),尤其在手机上
*
*/
.state('home',{
//路由,这里的用法基本与ngRoute一样
url: '/home',
templateUrl: 'home.html',
controller: '',
resolve: {
}
})
.state('other',{
url: '/other',
templateUrl: 'other.html'
})
//意外跳转
/**
* ngRoute默认跳转路由'/',如果when方法中有'/'路由,不写意外跳转也会跳转
*/
$urlRouterProvider.otherwise('/home');
}])
.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) {
$stateProvider
/**
* 第一个参数是状态,不是路由,一般情况下名字和路由名字一样
*
* ui-router是ng-route的一个升级版,基于状态机来组织接口,而不是简单的URL,基于ngRoute的,
* 能否完成一些场景的功能(有很多优秀的特性,比如ui-view嵌套,ngRoute无法实现ui-view嵌套),尤其在手机上
*
*/
.state('home',{
//路由,这里的用法基本与ngRoute一样
url: '/home',
templateUrl: 'home.html',
controller: '',
resolve: {
}
})
.state('other',{
url: '/other',
templateUrl: 'other.html'
})
//意外跳转
/**
* ngRoute默认跳转路由'/',如果when方法中有'/'路由,不写意外跳转也会跳转
*/
$urlRouterProvider.otherwise('/home');
}])
2.2、意外跳转的方式
1、直接跟路由路径
2、直接跟一状态
3、返回一函数
4、返回两个参数
5、返回两个参数,后一个为函数
6、.rule函数中返回一个函数
例子:
angular.module('myApp',['ui.router'])
//uiRouter 理念: 管理状态, 路由辅助
.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) {
$stateProvider
.state('home',{
url: '/home',
templateUrl: 'home.html'
});
//意外跳转的方法
// $urlRouterProvider.otherwise('/home');
// $urlRouterProvider.otherwise('home');
// $urlRouterProvider.otherwise(function ($injector,$location) {
// $location.path('/home');
// });
/**
* 第一个参数: 给空字符串,想要匹配的入口路径
* 第二个参数: 重新指向的路由
*/
// $urlRouterProvider.otherwise('','home');
/**
* 如果第二个参数是函数,需要返回路由路径
*/
// $urlRouterProvider.otherwise('',function () {
// return 'home';
// });
$urlRouterProvider.rule(function ($injector,$location) {
return '/home';
});
}]);
//uiRouter 理念: 管理状态, 路由辅助
.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) {
$stateProvider
.state('home',{
url: '/home',
templateUrl: 'home.html'
});
//意外跳转的方法
// $urlRouterProvider.otherwise('/home');
// $urlRouterProvider.otherwise('home');
// $urlRouterProvider.otherwise(function ($injector,$location) {
// $location.path('/home');
// });
/**
* 第一个参数: 给空字符串,想要匹配的入口路径
* 第二个参数: 重新指向的路由
*/
// $urlRouterProvider.otherwise('','home');
/**
* 如果第二个参数是函数,需要返回路由路径
*/
// $urlRouterProvider.otherwise('',function () {
// return 'home';
// });
$urlRouterProvider.rule(function ($injector,$location) {
return '/home';
});
}]);
2.3、状态路由的resolve属性与factory配置服务获取数据处理
resolve属性的特点:列表中(对象中的key值)可以注入到控制器中使用;如果key值是字符串,那么注入的服务名必须是该字符串;如果key值是函数,那么注入的服务名必须是函数的参数
例子:
angular.module('myApp',['ui.router'])
.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) {
$stateProvider
.state('home',{
url: '/home',
templateUrl: 'home.html',
controller: 'HomeController',
resolve: {
myFoo: 'foo',
//在这里,我们可以用到上面的属性,这里和ngRoute里面不一样,上面的key就是服务的名字
getName: function (myFoo) {
return myFoo.name;
},
/**
* 如果返回的对象是一个promise,那么该对象会在控制器实例化之前解析完数据
* @param $http
* @returns {*}
*/
setHttp: function ($http) {
return $http({
url: 'data/news.json',
method: 'get'
});
},
getData: function (setHttp) {
return setHttp.data;
}
}
})
.state('other',{
url: '/other',
templateUrl: 'other.html'
})
$urlRouterProvider.otherwise('/home');
}])
.factory('foo',function () {
return {
name: 'zs',
age: 12
}
})
.controller('HomeController',['$scope','myFoo','getName','setHttp','getData',function ($scope,myFoo,getName,setHttp,getData) {
// console.log(myFoo);
// console.log(getName);
console.log(setHttp.data);
console.log(getData);
}]);
.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) {
$stateProvider
.state('home',{
url: '/home',
templateUrl: 'home.html',
controller: 'HomeController',
resolve: {
myFoo: 'foo',
//在这里,我们可以用到上面的属性,这里和ngRoute里面不一样,上面的key就是服务的名字
getName: function (myFoo) {
return myFoo.name;
},
/**
* 如果返回的对象是一个promise,那么该对象会在控制器实例化之前解析完数据
* @param $http
* @returns {*}
*/
setHttp: function ($http) {
return $http({
url: 'data/news.json',
method: 'get'
});
},
getData: function (setHttp) {
return setHttp.data;
}
}
})
.state('other',{
url: '/other',
templateUrl: 'other.html'
})
$urlRouterProvider.otherwise('/home');
}])
.factory('foo',function () {
return {
name: 'zs',
age: 12
}
})
.controller('HomeController',['$scope','myFoo','getName','setHttp','getData',function ($scope,myFoo,getName,setHttp,getData) {
// console.log(myFoo);
// console.log(getName);
console.log(setHttp.data);
console.log(getData);
}]);
2.4、state中的模版属性解析
如果写了views属性:template与templateUrl就会失效
例子:
angular.module('myApp',['ui.router'])
.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) {
$stateProvider
.state('index',{
url: '/index',
abstract: true,
templateUrl: 'index.html',
//如果写了views属性,template和templateUrl会失效
views: {
home: {
templateUrl: 'home.html'
},
other: {
templateUrl: 'other.html'
}
}
})
$urlRouterProvider.otherwise('/index');
}])
.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) {
$stateProvider
.state('index',{
url: '/index',
abstract: true,
templateUrl: 'index.html',
//如果写了views属性,template和templateUrl会失效
views: {
home: {
templateUrl: 'home.html'
},
other: {
templateUrl: 'other.html'
}
}
})
$urlRouterProvider.otherwise('/index');
}])
2.5、state中的abstract属性
设置改模版为抽象模版
如果值为true,表示抽象模版永远不会被激活,但是可以设置为被激活的字节点,可以使包装器包含
例子:
angular.module('myApp',['ui.router'])
.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) {
$stateProvider
.state('tab',{
url: '/tab',
//abstract为true,表示抽象模版永远不能被激活,但是可以设置为被激活的子节点,可以使包装器包含
abstract: true,
templateUrl: 'tab.html'
})
.state('tab.news',{
url: '/news',
templateUrl: 'news.html'
})
.state('tab.live',{
url: '/live',
templateUrl: 'live.html'
})
.state('tab.talk',{
url: '/talk',
templateUrl: 'talk.html'
})
.state('tab.mine',{
url: '/mine',
templateUrl: 'mine.html'
});
$urlRouterProvider.otherwise('/tab/news');
}])
.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) {
$stateProvider
.state('tab',{
url: '/tab',
//abstract为true,表示抽象模版永远不能被激活,但是可以设置为被激活的子节点,可以使包装器包含
abstract: true,
templateUrl: 'tab.html'
})
.state('tab.news',{
url: '/news',
templateUrl: 'news.html'
})
.state('tab.live',{
url: '/live',
templateUrl: 'live.html'
})
.state('tab.talk',{
url: '/talk',
templateUrl: 'talk.html'
})
.state('tab.mine',{
url: '/mine',
templateUrl: 'mine.html'
});
$urlRouterProvider.otherwise('/tab/news');
}])
2.6、state状态路由中传递参数的方法
区分传递参数与接受参数的对应格式
例子:
angular.module('myApp',['ui.router'])
.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) {
$stateProvider
.state('home',{
url: '/home',
templateUrl: 'home.html',
controller: 'HomeController'
})
.state('other',{
// url: '/other',
// url: '/other/:name',
// url: '/other/{name}',
//跟正则针对$location服务
// url: '/other/{name: [0-9]}',
//查询参数,这样写暴露在地址栏中不安全
// url: '/other?name',
/**
* 一般传参数,这样传,参数写在params(参照post请求)
*/
url: '/other',
params: {
name: '',
id: ''
},
templateUrl: 'other.html',
controller: 'OtherController',
//进入页面时会走该方法
onEnter: function () {
console.log('enter');
},
//离开时走该方法
onExit: function () {
console.log('exit');
}
});
$urlRouterProvider.otherwise('home');
}])
.controller('HomeController',['$scope','$location','$state',function ($scope,$location,$state) {
$scope.toOtherView = function () {
//跟的是路由
// $location.path('/other/zs');
//跟的是状态
// $state.go('other',{name: 23});
// $location.path('/other/123');
//查询参数
// $location.url('/other?name=123');
$state.go('other',{name: 23});
}
}])
.controller('OtherController',['$scope','$location','$state','$stateParams',function ($scope,$location,$state,$stateParams) {
$scope.goBack = function () {
$state.go('home');
}
console.log($stateParams.name)
}])
.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) {
$stateProvider
.state('home',{
url: '/home',
templateUrl: 'home.html',
controller: 'HomeController'
})
.state('other',{
// url: '/other',
// url: '/other/:name',
// url: '/other/{name}',
//跟正则针对$location服务
// url: '/other/{name: [0-9]}',
//查询参数,这样写暴露在地址栏中不安全
// url: '/other?name',
/**
* 一般传参数,这样传,参数写在params(参照post请求)
*/
url: '/other',
params: {
name: '',
id: ''
},
templateUrl: 'other.html',
controller: 'OtherController',
//进入页面时会走该方法
onEnter: function () {
console.log('enter');
},
//离开时走该方法
onExit: function () {
console.log('exit');
}
});
$urlRouterProvider.otherwise('home');
}])
.controller('HomeController',['$scope','$location','$state',function ($scope,$location,$state) {
$scope.toOtherView = function () {
//跟的是路由
// $location.path('/other/zs');
//跟的是状态
// $state.go('other',{name: 23});
// $location.path('/other/123');
//查询参数
// $location.url('/other?name=123');
$state.go('other',{name: 23});
}
}])
.controller('OtherController',['$scope','$location','$state','$stateParams',function ($scope,$location,$state,$stateParams) {
$scope.goBack = function () {
$state.go('home');
}
console.log($stateParams.name)
}])
1 0
- ngRoute路由改变监听事件(1)+ui.router状态路由
- UI-Router的路由事件
- Angular路由:ui-router
- angular路由 ui.router
- angularjs路由改变的事件监听
- angular-ui-router页面路由
- AngularJS ui-router (嵌套路由)
- AngularJS ui-router (嵌套路由)
- 学习 ui-router - 路由控制
- 学习 ui-router - 路由控制
- 学习 ui-router - 路由控制
- AngularJS ui-router (嵌套路由)
- AngularJS ui-router (嵌套路由)
- AngularJS ui-router (嵌套路由)
- AngularJS ui-router (嵌套路由)
- AngularJS ui-router (嵌套路由)
- ui-router - 路由控制$stateProvider
- AngularJS ui-router (嵌套路由)
- 15种能力:决定了你的未来能走多远
- CountDownLatch、CyclicBarrier、Semaphore共同之处与区别以及各自使用场景
- 【学与思】——你所忽略的小事恰恰是别人成功的跳板
- Ubuntu16.04下编译ORB_SLAM2错误
- Java读写CSV格式文件(opencsv)
- ngRoute路由改变监听事件(1)+ui.router状态路由
- Failed to decode downloaded font 问题解决
- 网易视频云干货分享:2B产品经理如何养成
- sql分页语句
- C# VS2010 windows服务的安装
- python学习之 字符串前'r'的用法
- java 加密jdbc连接
- c++
- 设计HashMap中元素put顺序和输出顺序相同