2017-04-04 62 views
2

我有一个角2(离子型2)应用程序,我躲使用*ngIf如果网络脱机一些元素,并显示另一个按钮,“重试” DOM已准备就绪。如何检测时后* ngIf条件设置为true

当我点击重试按钮,如果网络回来,我然后想要重新显示由*ngIf隐藏的元素。此外,我还需要通过@ViewChild(例如,Ionic 2滑块获取它的当前索引)来引用其中的一些。我的问题是,当我尝试在相同的函数调用中获取对它们的引用时,这些元素并不是全部定义的,这些函数将绑定到*ngIf的属性重新设置为true。

我已经尝试过从setTimeout中调用,但这似乎不是很安全 - 有些DOM元素回来了,但并非全部。

有没有办法知道DOM准备好了所有被*ngIf隐藏的元素,还是我需要找到其他一些方法来做到这一点(不使用*ngIf,所以元素并没有实际移除)。

在此先感谢您的任何建议!

回答

0

我认为你正在寻找了解this

enter image description here

我觉得ngAfterViewInit()将帮助您完成此,

ngAfterViewInit()响应角初始化该组件的 观点和后儿童的意见。

在第一个ngAfterContentChecked()后调用一次。

仅限组件的钩子。

2

您应该能够通过查看通过NgZone发出的onStable事件做你想做什么:

分量模板:

<button (click)="showFoo = !showFoo">toggle</button> 
<div *ngIf="showFoo" #foo >foo</div> 

在你的组件类

@ViewChild('foo') foo: ElementRef; 
showFoo = false; 

constructor(private zone: NgZone) { 
    zone.onStable.subscribe(() => { 
    console.log(this.foo); 
    // this will log either undefined or an ElementRef as you toggle 
    }); 
} 

下面是一个显示它正在工作的plunk:https://plnkr.co/edit/jKSaEI0XUcJQehZnJTxB

+0

感谢您的建议,并且似乎在该示例中起作用。我将它添加到我的项目中,并且它确实触发了,但是当我尝试在此事件中尝试访问它时,我的一个离子选择仍然不可用。我从那以后只是在这种情况下切换了可见性,因为这并不能去掉任何东西。 – peterc