angular 路由功能非常强大,同时angular的路由也非常脆弱,非常容易出现错误。

那么在我们遇到异常时,首先要做的是什么?

第一步:检查代码,对比官方文档,发现代码中不一致的地方进行改正。

第二步:调试代码,观察调用过程中参数传递是否正常。

第三步:百度一下。

对于我这个观点,可能会有人不服气,出现异常不应该第一时间问度娘吗?对于较熟悉angular 路由的人来说,这确实是一个快速的解决问题之道,但不是我们学习的根本。我们学习要知根知底。

对于angular的子路由,我们来看一个例子

  1. import { NgModule } from '@angular/core';
  2. import { Routes, RouterModule } from '@angular/router';
  3. import { Leftlistzuhezuheleftlistform1030RootComponent } from './components/root-component/rootcomponent';
  4. import { RootComponent as zuheRight2Form1030RootComponent } from '../../../../zuheright2form1030/components/root-component/rootcomponent';
  5.  
  6. const routes: Routes = [
  7. {
  8. path: '', component: Leftlistzuhezuheleftlistform1030RootComponent,
  9. children: [{
  10. path: 'KK/:id/:name'
  11. , component: zuheRight2Form1030RootComponent
  12. }
  13. ]
  14. }
  15. ];
  16.  
  17. @NgModule({
  18. imports: [
  19. RouterModule.forChild(routes)
  20. ],
  21. exports: [
  22. RouterModule
  23. ]
  24. })
  25. export class Leftlistzuhezuheleftlistform1030zuheleftListForm1030RoutingModule { }

我们如何进行路由跳转呢,我们一般通过路由组件的navigate方法,而不是通过超链接,毕竟通过代码可以自定义变量、自定义url、自定义一系列东东。

  1. import { Injectable } from '@angular/core';
  2. import { Router, RouterModule, ActivatedRoute } from '@angular/router';
  3. @Injectable()
  4. export class ZuheleftListForm1030FrmVfvfvfService {
  5. constructor( private router: Router,
  6. private route: ActivatedRoute) { }
  7.  
  8. dk() {
  9. console.log("执行路由跳转");
  10. this.router.navigate(["right1"],{relativeTo:this.route});
  11. }
  12. }

当我们通过我们自定义的方法进行路由跳转时,我们看到控制台输出了 执行路由跳转字样,说明这个方法被调用了,但是同时我们在控制台也看到了一个错误:Navigation triggered outside Angular zone, did you forget to call ‘ngZone.run() 。虽然该错误并没有被标记成error但我们仍要解决下,否则路由跳转会出现让我们意想不到的结果。

如何解决该问题呢?通过分析我们代码,我们发现我们自定义的方法并没有包含在angular 的ngZone中,那么什么是ngZone呢。

了解了一系列的原因,解决该问题就比较简单了,从ngZone中去执行路由跳转,即可。

处理方式:

  1. import { Injectable,NgZone } from '@angular/core';
  2. import { Router, RouterModule, ActivatedRoute } from '@angular/router';
  3. @Injectable()
  4. export class ZuheleftListForm1030FrmVfvfvfService {
  5. constructor(
  6. private router: Router,
  7. private route: ActivatedRoute,
  8. private ngZone: NgZone,
  9.  
  10. ) { }
  11.  
  12. dk()
  13. {
  14. console.log("执行路由跳转");
  15. this.ngZone.run(()=>{
  16. this.router.navigate(["kk"],{relativeTo:this.route}).then();
  17. });
  18. }
  19. }

angular 路由跳转经常出现找不到匹配Url的问题,针对这个问题,我们首选的方案是将子路由相对当前路由进行跳转。也就是我们在执行

  1. this.router.navigate(["kk"],{relativeTo:this.route}).then();
  1. 加上relativeTo的原因。相对当前路由进行跳转,可以最大限度的减少路由地址不匹配的问题。
  2.  
  3. angular 路由需要我们持续的去审阅,多尝试,多阅读,必然了然于心。

angular 子路由跳转出现Navigation triggered outside Angular zone, did you forget to call ‘ngZone.run() 的问题修复的更多相关文章

  1. vue 二级子路由跳转不了 bug

    vue 二级子路由跳转不了 bug @click.prevent 阻止原生事件的冒泡 <li class="tools-hover-box-list-item" v-for= ...

  2. Angular 1 深度解析:脏数据检查与 angular 性能优化

    TL;DR 脏检查是一种模型到视图的数据映射机制,由 $apply 或 $digest 触发. 脏检查的范围是整个页面,不受区域或组件划分影响 使用尽量简单的绑定表达式提升脏检查执行速度 尽量减少页面 ...

  3. angular中路由跳转并传值四种方式

    一.路由传值 步骤1 路由传递参数 注意 一定是要传递 索引值 let key = index 这种情况是在浏览器中可以显示对应的参数 这种的是问号 localhost:8080/news?id=2& ...

  4. angular的路由跳转,的监听$rootScope.$on

    使用angular来做项目时,习惯性的使用第三方路由插件ui-router配置路由.每一个状态都对应着一个页面, 因此对路由状态改变的监听也变的十分重要. 可以使用:$rootScope.$on(…… ...

  5. angular源码分析:injector.js文件分析——angular中的依赖注入式如何实现的(续)

    昨天晚上写完angular源码分析:angular中jqLite的实现--你可以丢掉jQuery了,给今天定了一个题angular源码分析:injector.js文件,以及angular的加载流程,但 ...

  6. 【Angular专题】——(2)【译】Angular中的ForwardRef

    原文地址:https://blog.thoughtram.io/angular/2015/09/03/forward-references-in-angular-2.html 作者:Christoph ...

  7. [Angular] Fetch non-JSON data by specifying HttpClient responseType in Angular

    By default the new Angular Http client (introduced in v4.3.1) uses JSON as the data format for commu ...

  8. [Angular] Create a custom validator for reactive forms in Angular

    Also check: directive for form validation User input validation is a core part of creating proper HT ...

  9. [Angular 8] Calculate and Measure Performance budgets with the Angular CLI

    Measuring is extremely important, without numbers we don’t know about potential problems and we don’ ...

随机推荐

  1. CDH集群的时间同步--简要配置要求

    每个节点执行ntpstat 和 timedatectl 都显示同步并且时间相同,那么CDH才能正常使用.每次ntp服务同步到外部授时中心都要一段时间(5~10分钟),只有当NTP server(nod ...

  2. uni-app实现滑动切换效果

    在对于uni-app框架了解之后,今天就实现一个滚动切换tab效果,这个很常见的一个效果,最后封装成一个组件,便于以后使用,写这个需要引入uni官方提供的uni.css样式,用到了写好的样式,就不需要 ...

  3. 使用.net core3.0 正式版创建Winform程序

    前阵子一直期待.net core3.0正式版本的出来,以为这个版本出来,Winform程序又迎来一次新生了,不过9.23日出来的马上下载更新VS,创建新的.net core Winform项目,发现并 ...

  4. unzip 命令指定解压路径

    在使用unzip进行文件包解压,可以用来解压zip/jar/war包类型,有时解压时需要解压到指定路径时可以使用参数 -d 来指定,例如: unzip services-bak.jar -d ./we ...

  5. 使用ImageIO.write上传二维码文件时候,提示系统找不到指定路径

    报错如图所示: java.io.FileNotFoundException: E:\SF\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtp ...

  6. centos7 Apache开启URL重写组件并配置.htaccess实现伪静态

    第一.修改httpd.conf文件 A - 在etc/httpd/conf/目录下的httpd.conf 文件,找到: LoadModule rewrite_module modules/mod_re ...

  7. Python IAQ中文版 - Python中少有人回答的问题

    Python中少有人回答的问题 The Python IAQ: Infrequently Answered Questions 1 Q: 什么是"少有人回答的问题(Infrequently ...

  8. 制作你的第一个dockerfile文件

    From this lesson you will从这里你将学到1,Make a Dockerfile制作一个Dockerfile2,Build a Docker Image and run构建镜像并 ...

  9. 链表二:链表中倒数第k个结点

    题目:链表中倒数第k个结点描述:输入一个链表,输出该链表中倒数第k个结点.解决方案:思路: 根据规律得出倒数第k个节点是 n-k+1个节点 方法一:先计算出链表的长度,在循环走到n-k+1步.(相当于 ...

  10. 《Java语言程序设计》编程练习8.9(游戏:#字游戏)

    8.9 (游戏:#字游戏)在并字游戏中,两个玩家使用各自的标志(一方用X则另一方就用O),轮流填写3x3的网格中的某个空格.当一个玩家在网格的水平方向.垂直方向或者对角线方向上出 现了三个相同的X或三 ...