Reputation: 534
Following is my service where I emits two events dataLoaded
and loadingData
I want to show and hide GIF image when data is loading and loaded respectively, and in component I catch both events and change the value of Boolean variable. But when page loads first time initially loading GIF is not showing and when data loaded then GIF appeared and if I select filter to search then it works fine and also when I debug the code the value of showLoading
updated successfully
Service
import { forwardRef, Injectable, EventEmitter } from '@angular/core';
import { Http, Headers, RequestOptions, Response, URLSearchParams } from '@angular/http';
import 'rxjs/add/operator/toPromise';
@Injectable()
export class SearchService {
loadingData = new EventEmitter();
dataLoaded = new EventEmitter();
pages: any = {};
searchResults = [];
search() {
this.loadingData.emit("ShowLoading")
this.performSearch().then(response => {
this.searchResults = response.json();
this.pages = this.searchResults['pages'];
this.searchResults = this.searchResults['data'];
this.resultsUpdated.emit('SearchResultsUpdated');
this.dataLoaded.emit("HideLoading")
}, error => {
this.dataLoaded.emit("HideLoading")
});
}
}
Component
import { Component, ViewChild, ElementRef } from '@angular/core';
import { SearchService } from '../../search.service';
/*import {Alert} from "../../alert.component";*/
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { SavedSearchComponent } from '../saved-search/saved-search.component';
@Component({
selector: 'property-onion-search-results',
templateUrl: './search-results.component.html'
})
export class SearchResultsComponent {
@ViewChild('searchResultArea') resultsArea: ElementRef;
searchResults: any[] = null;
closeResult: string;
view = 'regular';
resultInformation: any[];
filterString: string = "";
resultCount: number = 0;
numbers: any[] = null;
showLoading;
constructor(private searchService: SearchService, private modalService: NgbModal) {
this.searchService.resultsUpdated.subscribe(data => {
this.searchResults = this.searchService.getResults();
this.filterString = this.searchService.toString();
this.resultCount = this.searchService.pages.total;
var pages = this.searchService.pages.number_of_pages;
if (this.searchService.pages.total > 25) {
this.numbers = new Array(pages).fill(1).map((x, i) => i);
} else {
this.numbers = null;
}
this.resultsArea.nativeElement.click(); // THis is a hack to fix refresh issue of this area. This area doesn't get refreshed unless you click somewhere in the browser.
});
this.searchService.loadingData.subscribe(data => {
console.log("show")
this.showLoading = true
});
this.searchService.dataLoaded.subscribe(data => {
console.log("hide")
this.showLoading = false
});
}
}
html
<img class="loading" *ngIf="showLoading" src="images/loader.gif"/>
Upvotes: 3
Views: 739
Reputation: 1710
For initial loading you should define showLoading directly in your component :
showLoading:boolean = true;
Upvotes: 2