Problem: In Susper the suggestions box doesn’t hide when there are no suggestions. To fix this, we have used @Output to create interaction between the search bar and suggestions box.
Susper gives suggestions to the user when user types a query. These suggestions are retrieved from the suggest.json endpoint from Yacy server.
We have a separate component for searching a query and a separate component for showing suggestions (auto-complete.component.ts). The architectural link between the query box, suggestion box and the results page is a bit complicated.
The search bar and the auto-complete component doesn’t interact directly. Whenever a new query is entered, the search bar triggers an action with a payload including the query. On receiving the new query, auto-complete component calls Yacy server to get suggestions from the endpoint and display them inside the suggestion box. Whenever a user searches making a new query, the search bar implementation opens the suggestion box even if there are no results. So there should be a way to inform search bar component that suggestions box has received empty results and search bar could hide the suggestions box.
To achieve this we used @Output to emit an event
@Output() hidecomponent: EventEmitter<any> = new EventEmitter<any>();
autocomplete.component.ts:-
this.autocompleteservice.getsearchresults(query).subscribe(res => { if (res) { if (res[0]) { this.results = res[1]; if (this.results.length === 0) { this.hidecomponent.emit(1); } else { this.hidecomponent.emit(0); } }
Then in search bar component, this is binded to a function hidesuggestions() which takes care of hiding the suggestion box.
searchbar.component.html
<app-auto-complete (hidecomponent)="hidesuggestions($event)" id="auto-box" [hidden]="!ShowAuto()"></app-auto-complete>
searchbar.component.ts
hidesuggestions(data: number) { if (data === 1) { this.displayStatus = 'hidebox'; } else { this.displayStatus = 'showbox'; } } ShowAuto() { return (this.displayStatus === 'showbox'); }
Here you could see that the auto-complete component’s hidden attribute in searchbar.component.ts is binded with ShowAuto() function which takes care about the interaction and hides the suggestions box whenever there are no results.
Below a GIF shows how this suggestions feature is working on Susper
Source code related to this implementation is available at this pull
References:
- Interaction between components in Angular: https://angular.io/guide/component-interaction