设置
我用自己的简单应用程序教自己Angular:一个将使用路由,服务等的游戏。在着陆页(路线为' /'),我想要要隐藏的标题。标题和router-outlet
在这样的app-component中一起出现(包括品牌中的一些调试输出):
<nav class="navbar navbar-default navbar-fixed-top" [hidden]="!showHeader">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="" [routerLink]="['/']">FARKLE! {{showHeader | json}}</a>
</div>
</div>
</nav>
<div class="container">
<router-outlet></router-outlet>
</div>
组件类声明布尔值showHeader
并尝试在路由更改时更新它:
import { Component, OnInit } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent implements OnInit {
showHeader: boolean;
constructor(
private router: Router
) {}
ngOnInit () {
this.showHeader = true;
this.router.events.subscribe(this.setHeader());
}
private setHeader () {
var showHeader = this.showHeader;
return function (event) {
if (event instanceof NavigationEnd) {
showHeader = event.url === '/';
console.log(event.url, showHeader, this.showHeader);
};
};
}
}
this.showHeader
的值ngOnInit
正确设置,标题将根据初始化方式显示或不显示。控制台显示导航期间发生的事件以及正确确定的值。问题在于,在回调的上下文中,this
不再是组件。所以,我尝试通过引用传递this.showHeader
。但是,showHeader
没有反映在模板中(很可能是因为它实际上没有进入事件回调的范围。
问题
那么,如何通过observable的回调来影响组件范围?
答案 0 :(得分:0)
我理解的是,您正在关闭,setHeader
返回的功能将被注册为订阅。
setHeader
返回的function
应使用Arrow
功能,以便坚持纠正此
private setHeader () {
var showHeader = this.showHeader;
//return function (event) {
//should get changed to below line
return (event) => { //Use Arrow function here.
if (event instanceof NavigationEnd) {
showHeader = event.url === '/';
console.log(event.url, showHeader, this.showHeader);
};
};
}
答案 1 :(得分:0)
您需要将this
关键字绑定到setHeader
函数。
您可以通过两种方式实现这一目标:
this.router.events.subscribe(() => this.setHeader());
bind
this.router.events.subscribe(this.setHeader.bind(this));