Angular 监听路由变化

Angular路由监听实践
本文介绍了一个使用AngularJS进行路由监听的实例,展示了如何通过监听路由的变化来实现特定的功能,例如根据传入的参数动态地改变页面内容。文章还涉及了在不同阶段触发的事件及其用途。

var app = angular.module('Mywind',['ui.router'])

//Angular 监听路由变化
function run($ionicPlatform, $location, Service, $rootScope, $stateParams) {
//路由监听事件
$rootScope.$on('$stateChangeStart',
  function(event, toState, toParams, fromState, fromParams) {
    console.log(event);
    console.log(toState);
    console.log(toParams);
    console.log(fromState);
    console.log(fromParams);
//判断当前路由
    if (toState.name == "index1") {
//获取参数之后可以调请求判断需要渲染什么页面,渲染不同的页面通过 $location 实现
      if (toParams.id == 10) {
        $location.path();//获取路由地址
        $location.path('/validation').replace();
        event.preventDefault()//可以阻止模板解析
      }
    }
})
// stateChangeSuccess 当模板解析完成后触发
  $rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {

  })
// $stateChangeError 当模板解析过程中发生错误时触发
  $rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error) {

  })
}
app.controller('Myautumn',function($scope,$http,$filter){

  

//执行路由事件
// $viewContentLoading- 当视图开始加载,DOM渲染完成之前触发,该事件将在$scope链上广播此事件。
  $scope.$watch('$viewContentLoading',function(event, viewConfig){
// alert('模板加载完成前');
  });
//$viewContentLoaded- 当视图加载完成,DOM渲染完成之后触发,视图所在的$scope发出该事件。
  $scope.$watch('$viewContentLoaded',function(event){
// alert('模板加载完成后');
  });

}); 

 

转载于:https://www.cnblogs.com/wr1994/p/8337829.html

<think>好的,我现在需要帮用户解决在Angular监听路由URL变化的问题。用户之前问过关于变量监听的方法,现在转向路由监听。首先,我得回忆一下Angular监听路由变化的几种方法,并结合用户提供的引用内容来组织回答。 用户提供的引用1是关于AngularJS(Angular 1.x)的路由配置,使用$urlRouterProvider进行重定向。这可能和用户当前使用的Angular版本不符,因为用户现在的问题可能涉及Angular 2+,因为引用了Angular4和Angular学习笔记中的Router.events。需要确认Angular版本,但根据用户的问题,应该以Angular 2+为主。 引用2和3提到了Angular中使用Router.events来监听路由事件,特别是过滤NavigationEnd事件。引用4是AngularJS的app.run方法,同样可能不适用。因此,主要参考引用2和3的内容。 用户上一次的问题是关于变量监听,现在转向路由监听,可能需要区分不同版本的Angular。但用户提到的Angular4和Angular学习笔记,说明用户在使用Angular 2+,所以应重点介绍Router.events的方法。 接下来,我需要整理几种监听路由变化的方法: 1. **Router.events订阅**:这是Angular 2+的标准方法,通过订阅路由事件,过滤出NavigationEnd事件,这样可以获取到路由变化后的URL。需要导入Router, NavigationEnd等,并在构造函数中订阅。同时要注意取消订阅,防止内存泄漏。 2. **ActivatedRoute监听**:通过订阅ActivatedRoute的params或queryParams来监听参数变化,适用于参数变化的场景,但可能不捕获完整的URL变化。 3. **Location监听**(AngularJS):如果用户还在用AngularJS,可能需要使用$location服务,但根据引用,用户现在应该用新版本,所以可能不需要重点提,但可以简要说明。 然后需要比较这些方法的适用场景,比如全局监听用Router.events,参数监听用ActivatedRoute。同时要提醒内存泄漏的问题,比如在组件销毁时取消订阅。 用户提供的示例代码中有使用filter操作符,但在Angular 2+中可能需要使用pipe和filter操作符,rxjs6+的语法,所以代码示例需要更新,使用pipe方法。 可能还需要提到如何获取当前路由的URL,比如使用router.url或者在NavigationEnd事件中获取event.url。 最后,生成相关问题,可能涉及路由守卫、参数获取、性能优化等。 需要确保回答结构清晰,分点说明,代码示例正确,并引用提供的引用来源。同时,根据用户之前的回答,保持类似的格式,比如分点、代码块、对比表格等。</think>在Angular监听路由URL变化的实现主要有以下三种核心方法,根据Angular版本和需求场景选择最合适的方式: --- ### 一、使用`Router.events`订阅路由事件 (推荐) **适用场景**:全局监听所有路由变化事件(Angular 2+)[^2][^3] **实现步骤**: 1. 注入`Router`服务 2. 订阅`router.events`并过滤`NavigationEnd`事件 3. 获取变化后的URL信息 ```typescript import { Component, OnDestroy } from '@angular/core'; import { Router, NavigationEnd } from '@angular/router'; import { filter } from 'rxjs/operators'; import { Subscription } from 'rxjs'; @Component({...}) export class AppComponent implements OnDestroy { private routerSub: Subscription; constructor(private router: Router) { // 监听导航完成事件 this.routerSub = this.router.events.pipe( filter(event => event instanceof NavigationEnd) ).subscribe((event: NavigationEnd) => { console.log('新URL:', event.url); // 获取完整URL console.log('新路由路径:', event.urlAfterRedirects); }); } ngOnDestroy() { this.routerSub.unsubscribe(); // 必须取消订阅 } } ``` **关键点**: - `NavigationEnd`表示路由导航成功完成[^3] - 可获取`url`和`urlAfterRedirects`两种路径 - 需手动管理订阅生命周期防止内存泄漏 --- ### 二、通过`ActivatedRoute`监听参数变化 **适用场景**:监听当前路由参数/查询参数变化 ```typescript import { ActivatedRoute } from '@angular/router'; @Component({...}) export class DetailComponent { constructor(private route: ActivatedRoute) { // 监听路径参数变化 this.route.params.subscribe(params => { console.log('路径参数更新:', params.id); }); // 监听查询参数变化 this.route.queryParams.subscribe(queryParams => { console.log('查询参数更新:', queryParams); }); } } ``` --- ### 三、AngularJS的兼容方案(旧版本) **适用场景**:Angular 1.x项目监听路由变化[^1][^4] ```javascript // 在app.run中监听 app.run(['$rootScope', '$location', function($rootScope, $location) { $rootScope.$on('$locationChangeSuccess', (event, newUrl, oldUrl) => { console.log('旧URL:', oldUrl); console.log('新URL:', newUrl); }); }]); ``` --- ### 方法对比 | 方法 | 版本支持 | 数据粒度 | 典型应用场景 | |--------------------|------------|----------------|-------------------------| | Router.events | Angular 2+ | 完整路由事件 | 全局路由日志/权限控制 | | ActivatedRoute | Angular 2+ | 路由参数变化 | 详情页ID变更处理 | | $locationChange | AngularJS | 完整URL比对 | 旧版本项目维护 | --- ### 高级技巧 1. **路由变化拦截**:配合`CanActivate`守卫实现权限控制 2. **URL解析**:使用`Router.parseUrl()`解析复杂URL结构 3. **防抖处理**:对高频路由跳转添加`.pipe(debounceTime(300))`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值