Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 597|回复: 0

angularjs路由监听,uirouter感知路由变化,解决uirouter路由监听不生效的问题

[复制链接]
  • TA的每日心情
    奋斗
    前天 12:49
  • 签到天数: 789 天

    [LV.10]以坛为家III

    2049

    主题

    2107

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    722638
    发表于 2021-6-26 13:40:46 | 显示全部楼层 |阅读模式

     壹 ❀ 引

    angularjs除了惊为天人的双向数据绑定外,路由也是出彩的一笔,通过路由配置,我们能在不发起页面跳转的情况下,对当前页内容进行整体更新,angularjs提供了ngRoute模块用于路由配置,除此之外,angularUI也提供了uirouter模块用于解决路由问题,本文将从ngRoute与uirouter两个模块出发,分别介绍两者的路由监听方法。

     贰 ❀ ngRoute路由监听

    ngRoute提供了路由事件用于监听路由过程中的每个阶段,可以为这些不同的路由事件设置监听器并在路由发生变化时做出响应。先上一个完整的例子,需要引入angularjs与angular-route.js

    <!DOCTYPE html>
    <html lang="en" ng-app="myApp">
    
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    
    <body ng-controller="myCtrl as vm">
        <ul>
            <li><a href="index.html#!/index">index</a></li>
            <li><a href="index.html#!/login">login</a></li>
            <li><a href="index.html#!/dashboard">dashboard</a></li>
        </ul>
        <div ng-view></div>
    </body>
    <script src="node_modules/angular/angular.js"></script>
    <script src="node_modules/angular-route/angular-route.js"></script>
    <script src="js/app.js"></script>
    
    </html>
    View Code
    angular.module('myApp', ['ngRoute'])
        .controller('myCtrl', function ($scope) {
            let vm = this
        })
        .config(['$routeProvider', function ($routeProvider) {
            // 在这里定义路由
            $routeProvider
                .when('/index', {
                    template: '<div><h2>Route1</h2></div>',
                })
                .when('/login', {
                    template: '<div><h2>Route2</h2></div>',
                })
                .when('/dashboard', {
                    template: '<div><h2>Route3</h2></div>',
                })
                .otherwise({
                    redirectTo: '/index'
                });
        }])
        .run(['$rootScope', '$location', function ($rootScope, $location) {
            $rootScope.$on('$routeChangeSuccess', function (evt, current, previous) {
                console.log(evt, current, previous);
                console.log(1);
            });
        }]);
    View Code

     

    1.$routeChangeStart

    AngularJS在路由变化之前会执行$routeChangeStart事件。在这一步中,路由服务会开始加载路由变化所需要的所有依赖,并且模板和resolve中的promise也会被resolve。

    angular.module('myApp', [])
        .run(['$rootScope', '$location', function ($rootScope, $location) {
            $rootScope.$on('$routeChangeStart', function (evt, current, previous) {
                // do something
                // evt 原始的AngularJS evt对象
                // current 用户当前所处的路由
                // current 上一个路由(如果当前是第一个路由,则为undefined)。
            });
        }]);

    2. $routeChangeSuccess

    AngularJS会在路由的依赖被加载后执行$routeChangeSuccess事件。

    angular.module('myApp', [])
        .run(['$rootScope', '$location', function ($rootScope, $location) {
            $rootScope.$on('$routeChangeSuccess', function (evt, current, previous) {
                // do something
                // evt 原始的AngularJS evt对象
                // current 用户当前所处的路由
                // previous 上一个路由(如果当前是第一个路由,则为undefined)。
            });
        }]);

    3. $routeChangeError

    AngularJS会在任何一个promise被拒绝或者失败时执行$routeChangeError事件。
    angular.module('myApp', [])
        .run(function ($rootScope, $location) {
            $rootScope.$on('$routeChangeError', function (current, previous, rejection) {
                // do something
                // current 当前路由的信息
                // previous 上一个路由的信息
                // rejection 被拒绝的promise的错误信息
            });
        });

    4. $routeUpdate

    AngularJS在reloadOnSearch属性被设置为false的情况下, 重新使用某个控制器的实例时,会执行$routeUpdate事件。

     叁 ❀ uirouter路由监听

    uirouter是由angualrUI提供的三方路由模块,因此也需要额外下载,并在主模块中注入路由模块,需要引入angualrjs,angular-ui-router.js与stateEvents.js,先看一个完整的例子:

    <!DOCTYPE html>
    <html lang="en" ng-app="myApp">
    
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    
    <body ng-controller="myCtrl as vm">
    
        <ul>
            <li><a ui-sref="index">index</a></li>
            <li><a ui-sref="login">login</a></li>
            <li><a ui-sref="dashboard">dashboard</a></li>
        </ul>
        <div ui-view></div>
    </body>
    </body>
    <script src="modules/angular.js"></script>
    <script src="modules/@uirouter/angularjs/release/angular-ui-router.js"></script>
    <script src="modules/@uirouter/angularjs/release/stateEvents.js"></script>
    <script src="demo.js"></script>
    
    </html>
    View Code
    angular.module('myApp', ['ui.router', 'ui.router.state.events'])
        .controller('myCtrl', function ($scope) {
            let vm = this
        })
        .config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {
            //设置路由初始页面
            $urlRouterProvider.otherwise('orderList');
            //路由配置
            $stateProvider
                .state('index', {
                    url: '/index',
                    template: '<div><h2>Route1</h2></div>',
                })
                .state('login', {
                    url: '/login',
                    template: '<div><h2>Route2</h2></div>',
                })
                .state('dashboard', {
                    url: '/dashboard',
                    template: '<div><h2>Route3</h2></div>',
                })
        }])
        .run(['$rootScope', function ($rootScope) {
            // 监听路由开始时触发
            $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
                //do something
                console.log(1);
                // event 该事件的基本信息
                // toState 当前路由的基本信息,比如路由名称,url,视图的控制器,模板路径等
                // toParams 当前路由的参数
                // fromState 上一个路由的基本信息,比如路由名称,url,视图的控制器,模板路径等
                // fromParams 上一个路由的参数
            });
            // 路由成功时触发
            $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {
                //do something
                // event 该事件的基本信息
                // toState 当前路由的基本信息,比如路由名称,url,视图的控制器,模板路径等
                // toParams 当前路由的参数
                // fromState 上一个路由的基本信息,比如路由名称,url,视图的控制器,模板路径等
                // fromParams 上一个路由的参数
            });
            // 路由错误时触发
            $rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {
                //do something
                // event 该事件的基本信息
                // toState 当前路由的基本信息,比如路由名称,url,视图的控制器,模板路径等
                // toParams 当前路由的参数
                // fromState 上一个路由的基本信息,比如路由名称,url,视图的控制器,模板路径等
                // fromParams 上一个路由的参数
                // error 错误信息
            });
        }]);
    View Code

    若$stateChangeStart之类的路由事件没触发,还是前面说的,得引入stateEvents.js文件,此文件在下载angular-ui-router.js时会同时包含。

     肆 ❀ 参考

     解决ui-router路由监听$stateChangeStart、$stateChangeSuccess、$stateChangeError不执行的问题

    angularJS路由详解

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-9-8 16:30 , Processed in 0.143215 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表