Javascript 聆听Angular 2中的元素可见性
我正在为我的webapp使用引导和Angular 2(v4)。我想听听关于可见性更改的指令中的一个元素。我的元素有一个父元素,它可以使用Javascript 聆听Angular 2中的元素可见性,javascript,angular,listener,Javascript,Angular,Listener,我正在为我的webapp使用引导和Angular 2(v4)。我想听听关于可见性更改的指令中的一个元素。我的元素有一个父元素,它可以使用hidden sm up隐藏它的子元素,我需要在每次隐藏或显示它时触发一个函数 div.hidden-sm-up input.form-control(myDirective, type='number') 在我的指示中: @Directive({ selector: '[myDirective]' }) export class myDire
hidden sm up
隐藏它的子元素,我需要在每次隐藏或显示它时触发一个函数
div.hidden-sm-up
input.form-control(myDirective, type='number')
在我的指示中:
@Directive({
selector: '[myDirective]'
})
export class myDirective {
constructor(private element: ElementRef, private renderer: Renderer){
}
ngAfterViewInit(): void{
// listen to visibility change here
}
}
ngDoCheck
在运行更改检测时运行,因此我认为如果您想监控它,而不是在组件创建时只获取一次,它是正确的位置:
@HostListener('window:resize')
ngDoCheck() {
this.isVisible = this.element.nativeElement.offsetParent !== null;
}
可能有更好的选择,比如一些在某处发出的事件,但对于一般情况,
ngDoCheck
应该可以正常工作。我发现了一个不错的博客<代码>主机侦听器具有可见的事件 您应该使用的主机属性component@BabarBilal请开发您的答案…它是如何隐藏或显示的?当元素不可见时,浏览器不提供任何事件,因此Angular也不提供该事件。@GünterZöchbauer如问题中所述,在父元素中使用.hidden sm up
。因此它是纯CSS。您只能通过迭代父项进行轮询,并检查hidden
或CSS中应用的任何内容的display
属性。不幸的是,调整浏览器大小时不会触发ngDoCheck
。您只需在ngDoCheck()之前添加@HostBinding('window:resize')
就可以了。我不知道如何使用主机绑定。。。我应该把ngDoCheck
放在括号里吗?应该是Hostlistener
而不是HostBinding
@GünterZöchbauer我对这个话题的理解是有限的,所以我的问题可能没有意义。在ngDoCheck
中调用offsetParent
是否会强制浏览器重新计算布局?似乎默认的更改检测策略可能会有问题。或者布局是否已在该点计算?我知道在ngDoCheck
中修改DOM可能不好。