Created
June 23, 2016 02:01
-
-
Save cesargalindo/ec3e6e14044f87474786688a358f4245 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// taken from Tutorial: Creating an Angular2 Autocomplete by Leonardo Jines | |
// http://4dev.tech/2016/03/tutorial-creating-an-angular2-autocomplete/#comment-1609 | |
import {Component, ElementRef} from 'angular2/core'; | |
@Component({ | |
selector: 'my-app', | |
host: { | |
'(document:click)': 'handleClick($event)', | |
}, | |
template: ` | |
<div class="container" > | |
<div class="input-field col s12"> | |
<!--NEW: added $event to filter() and (keydown)=handleBlur() --> | |
<input id="country" type="text" class="validate filter-input" [(ngModel)]=query (keyup)=filter($event) (keydown)=handleBlur() > | |
<label for="country">Country</label> | |
</div> | |
<div class="suggestions" *ngIf="filteredList.length > 0"> | |
<ul *ngFor="#item of filteredList" > | |
<li > | |
<a (click)="select(item)">{{item}}</a> | |
</li> | |
</ul> | |
</div> | |
</div> | |
` | |
}) | |
export class AppComponent { | |
public query = ''; | |
public countries = [ "Albania","Andorra","Armenia","Austria","Azerbaijan","Belarus","Belgium","Bosnia & Herzegovina", | |
"Bulgaria","Croatia","Cyprus","Czech Republic","Denmark","Estonia","Finland","France","Georgia", | |
"Germany","Greece","Hungary","Iceland","Ireland","Italy","Kosovo","Latvia","Liechtenstein", | |
"Lithuania","Luxembourg","Macedonia","Malta","Moldova","Monaco","Montenegro","Netherlands", | |
"Norway","Poland","Portugal","Romania","Russia","San Marino","Serbia","Slovakia", | |
"Slovenia","Spain","Sweden","Switzerland","Turkey","Ukraine","United Kingdom","Vatican City"]; | |
public filteredList = []; | |
public elementRef; | |
// NEW: added newly declared variable | |
public selectedIdx; | |
constructor(myElement: ElementRef) { | |
this.elementRef = myElement; | |
} | |
filter(event) { | |
if (this.query !== ""){ | |
this.filteredList = this.countries.filter(function(el){ | |
return el.toLowerCase().indexOf(this.query.toLowerCase()) > -1; | |
}.bind(this)); | |
// NEW: added new filter code | |
if (event.code == "ArrowDown" && this.selectedIdx == 0) { | |
this.selectedIdx--; | |
} | |
}else{ | |
this.filteredList = []; | |
} | |
} | |
select(item){ | |
this.query = item; | |
this.filteredList = []; | |
} | |
handleClick(event){ | |
var clickedComponent = event.target; | |
var inside = false; | |
do { | |
if (clickedComponent === this.elementRef.nativeElement) { | |
inside = true; | |
} | |
clickedComponent = clickedComponent.parentNode; | |
} while (clickedComponent); | |
if(!inside){ | |
this.filteredList = []; | |
} | |
} | |
// NEW: added new handleBlur function | |
handleBlur() { | |
if(this.selectedIdx > -1){ | |
this.query = this.filteredList[this.selectedIdx]; | |
} | |
this.filteredList = []; | |
this.selectedIdx = -1; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment