当前位置: 首页 > 知识库问答 >
问题:

Angular在以编程方式路由回页面时不调用ngOnInit

叶建柏
2023-03-14

我已经实现了以下控制台输出,以跟踪执行的内容和未执行的内容。/dataList下页面的代码。

export class DataList implements OnInit {

  constructor(private service: DataService) { 
    console.log("constructed");
  }

  ngOnInit() {
    console.log("inited");
    ...
  }

}

现在,当通过输入URL访问页面时,以及当使用从另一个页面的路由访问页面时,它在控制台中提供输出(即构造和初始化),如下所示。

this.router.navigateByUrl("/dataList");

但是,当我从这个页面导航到一个详细的页面(URL类似于/dataElement/12345,12345是一个ID),然后返回到页面/数据列表执行上面显示的URL导航时,它不会显示initied(仅构造)。(如果我然后点击F5,我可以看到构造和初始化。)

考虑到实现的接口,我甚至不认为不进入ngOnInit就可以进入构造函数,但显然,我错了(而且也很困惑)。

我能想到的最好的诊断是,当从子路径的路由导航时,初始化不会被调用。但对我来说这似乎很奇怪,所以我怀疑我也没有正确诊断。谷歌搜索没有产生任何我认为足够相关的东西(像这样或这样)。路由是这样的。

const routes: Routes = [
  { path: "", component: StartComponent },
  { path: "dataList", component: DataListComponent },
  { path: "dataElement/:id", component: DataElementComponent },
  ...
  { path: "**", component: StartComponent }
];

共有1个答案

宗政子琪
2023-03-14

在我有了一些不可思议的天才之后(又称哑巴运气),我看到了Angular 5中的一个bug(还有一些4s)。显然,解决这个问题的魔法是这样的。

import { NgZone, ... } from "@angular/core";

export class DataElement implements OnInit {

  constructor(private zone: NgZone, ... ) { ... }

  shaboo() {
    ...
    this.zone.run(() => {
      this.router.navigateByUrl("/dataList");
    });
  }
}

现在,我不知道它是做什么的,更不知道它是怎么做的,为什么。我只是从这个地方复制了一个代码示例,如本文所述。这是不理解正在发生的事情的最短路径,我非常讨厌它,所以如果有人想提供一些关于这个主题的建议,我会欣喜若狂(同样,如果这些解释了这样一个简单的问题如何在版本5中仍然会导致问题,那将更加可怕)。

 类似资料:
  • 问题内容: 作为单元测试的一部分,我想调用限于错误信号部分的pylint检查器。因此我检查了pylint可执行脚本,进入了helper类,在那里我迷失了一个很长的函数,最后以调用。 有人尝试过并设法这样做吗? 梦想计划是这样的: 有什么提示吗?除了“复制方法并跳过”之外,我的意思是? 我并不 需要 通过运行测试,它也可能是或其他软件:随时提出替代方案。谢谢! 问题答案: 看一下,其中包含以编程方式

  • 问题内容: 在我看来,Apple鼓励我们放弃在SwiftUI中使用,但如果不使用视图控件,我会觉得有些无能为力。我想要的是能够实现某种将事件发送给的功能。 ViewModel : 查看 : 使用SwiftUI,我不知道如何实现以下功能: 如果登录成功,则推送另一个控制器 如果发生错误,则显示警报 此外,对于任何关于如何以更好的方式实现我想要的东西的建议,我也将不胜感激。谢谢。 更新1: 我能够显示

  • 问题内容: 我们可以使用以下方法导航到不同的路径 导航时是否可以发送参数(对象)? 我还有其他选择,但想知道是否可以通过? 我可以嵌入对象的ID并从新页面从服务器重新获取对象。 或者,我可以将对象存储在全局存储(如redux存储)中。(此对象需要尽快从商店中删除。因此,我认为将其放在第一位可能不好。) 问题答案: React Router使用对象。对象的属性之一是。 在导航到的页面上,电流将注入到

  • 问题内容: 在模块配置之后,例如在service中,有没有办法以编程方式将状态添加到$ stateProvider? 为了给这个问题增加更多的上下文,我有两种情况可以使用: 尝试强制在模块配置中定义的状态上重新加载,问题是状态将 reloadOnSearch 设置为 false ,所以当我尝试 $ state.go(’state.name’,{new:param},{reload:真正}); 什么

  • 我正在创建一个UI(以编程方式),它将显示两个主要部分 > 第一部分将显示一个视频播放器 第二部分将展示一个带有更多视频的UITableView 我已经成功地完成了第一部分,它正在工作,它占据了屏幕顶部的一小部分 使用相同的逻辑,我试图在主容器视图中添加一个UITableView,但我只能看到一个空的tableView 我还尝试在调用cellForRowAt时记录消息,但没有打印任何内容,我得出结

  • 问题内容: 使用jQuery,我想禁用主体的滚动: 我的想法是: 组 捕获当前 绑定到正文滚动事件,将scrollTop / scrollLeft设置为捕获的值。 有没有更好的办法? 更新: 我知道有人会在想“为什么他不只是在面板上使用?”。 请不要提出这个建议,因为我还有其他原因。 问题答案: 我发现执行此操作的唯一方法与您所描述的类似: 抓住当前滚动位置(不要忘记水平轴!)。 将溢出设置为隐藏

  • 我们使用命令启动角4应用程序,该命令创建一个进程。如何使用任何类型的命令或一般以编程方式停止此过程?我遇到了这个问题,它似乎很有用。但是我不知道如何或在哪里设置应用程序的标题?