Angular 角度9';这';路由器导航端在调试断点订阅时定义不足
我是个新手,还在学习 我有一个订阅router NavigationEnd事件的组件,它从服务访问路由解析中初始化的一些变量Angular 角度9';这';路由器导航端在调试断点订阅时定义不足,angular,typescript,debugging,angular-router,Angular,Typescript,Debugging,Angular Router,我是个新手,还在学习 我有一个订阅router NavigationEnd事件的组件,它从服务访问路由解析中初始化的一些变量 constructor(private route: ActivatedRoute, private router: Router) { var that = this; this.router.events.subscribe((event) => { if (event instanceof NavigationEnd) { this.no
constructor(private route: ActivatedRoute, private router: Router) {
var that = this;
this.router.events.subscribe((event) => {
if (event instanceof NavigationEnd) {
this.nominatim = this.route.snapshot.data.meetings.nominatim;
console.log(this.nominatim);
}
});}
调试代码时,this.namignim变量未定义,但它确实包含一个可以记录到控制台的值
我发现了另一个关于stackoverflow的问题,它解释了类似的情况
加入
var that = this;
在路由器事件订阅之前,我可以看到调试中的变量
如果我仍然可以使用“this”上下文,我会更喜欢它
我如何才能让它工作?首先,您不应该在构造函数内部订阅。Angular docs建议所有的工作(除了非常轻的变量赋值)都在ngOnInit中完成-为了安全起见,除了依赖项注入之外,您不应该使用构造函数 如果您将代码移动到ngOnInit,您可能会发现“this”是有效的。ngOnInit是一个有角度的生命周期钩子,在构造函数之后很快就会被自动调用 否则,您可以在ngOnInit中调用一个方法,如下所示:
ngOnInit() {
this.myCodeToSubscribeToRouterEvents()
}
private myCodeToSubscribeToRouterEvents() {
// TODO: Paste your subscription code here
}
然后在构造函数中,您可以编写:
constructor(private route: ActivatedRoute, private router: Router) {
this.myCodeToSubscribeToRouterEvents = this.myCodeToSubscribeToRouterEvents.bind(this);
}
是的,我知道我在构造函数中放入了代码,但这是极少数的例外情况之一。此构造函数代码确保myCodeToSubscribeToRouterEvents中的“This”始终是组件的实例(这是您想要的),而不是其他内容
希望能有帮助。J.E.S.U.S爱你:D
关于:
this.nominatim = this.route.snapshot.data.meetings.nominatim;
console.log(this.nominatim);
您的生活会更好:
this.nominatim = this.route.snapshot.data.meetings.nominatim;
console.log(this.route.snapshot.data);
因此,您可以检查数据是否通过:)谢谢。关于我为什么在构造函数中订阅NavigationEnd事件,有一个原因。这是一个路由,它在同一页上使用路由定义上的Runguard和resolver重新加载来自解析程序的数据。ngOnInit()方法似乎只在第一次创建的组件上运行。通过向构造函数添加以下代码,我发现每次重新加载路由时,ngOnInit()都会运行。this.router.RouterUseStrategy.shouldReuseRoute=()=>false;我已将代码移动到ngOnInit(),并能够使用“this”上下文进行调试。上帝保佑。