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');
        }
    }]);



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');
        }
    }]);



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');
    }])


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';
        });
    }]);


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',
            age12
        }
    })
    .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');
    }])


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');
           
    }])


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',{name23});
        }
    }])
    .controller('OtherController',['$scope','$location','$state','$stateParams',function ($scope,$location,$state,$stateParams) {
        $scope.goBack = function () {
            $state.go('home');
        }
        console.log($stateParams.name)
    }])








1 0
原创粉丝点击