I have Countdown jQuery function inside my Angular2 *ngIf and it is not working. I don't have any error in my console.log, but the div is empty. It's just showing the title (h1). Here is my code: HTML
<div class="row" *ngIf="isDataAvailable"><h1>Dashboard</h1><div id="kodeCountdown"></div></div>
Angular2 TypeScript Component
ngOnInit() {
this.getData().then(() => this.isDataAvailable = true);
}
ngAfterViewInit() {
if ($('#kodeCountdown').length) {
var austDay = new Date();
austDay = new Date(2017, 3, 2, 12, 10);
jQuery('#kodeCountdown').countdown({ until: austDay });
jQuery('#year').text(austDay.getFullYear());
}
}
Result: Dashboard
The problem is that the ngAfterViewInit
method is only called once after the component's view has been initialized. Since the *ngIf
condition hasn't been evaluated to true
when ngAfterViewInit
is called, your #kodeCountdown
element isn't visible which means that your countdown function isn't initialized.
One way to resolve this would be to execute that logic inside of the ngAfterViewChecked
method (instead of the ngAfterViewInit
method ), because then your code will be executed after *ngIf
has been evaluated:
ngOnInit() {
this.getData().then(() => this.isDataAvailable = true);
}
ngAfterViewChecked() {
if ($('#kodeCountdown').length) {
var austDay = new Date();
austDay = new Date(2017, 3, 2, 12, 10);
jQuery('#kodeCountdown').countdown({
until: austDay
});
jQuery('#year').text(austDay.getFullYear());
}
}
However, since the ngAfterViewChecked
method is called after every check of the component's view, you will need to add additional logic to ensure that your countdown logic is only implemented once. You could simply set a flag to handle that:
private isCountdownInitialized: boolean;
// ...
ngAfterViewChecked() {
if (!this.isCountdownInitialized && $('#kodeCountdown').length) {
this.isCountdownInitialized = true;
// ...
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With