考虑以下plunker
我有一个输入,当(focus)
我希望有以下行为时,它会扩展为下拉列表
dropdown
或input
,dropdown
应该签订合同 dropdown
,dropdown
应保持扩展 现在,当用户点击输入并点击下拉列表时,下拉列表就会缩小。
这是我的参考代码
@Component({
selector: 'my-app',
template: `
<div class="wrapper">
<input [(ngModel)]="searchText"
tabindex="0"
placeholder="name"
(focus)="inputShow()"
(blur)="inputHide()"
>
<div class="option-wrapper"
[hidden]="isHideList()"
tabindex="0"
(focus)="inputShow()"
(blur)="inputHide()">
<li class="options"
*ngFor="#option of optionlist">
<div >{{option['name']}}</div>
</li>
</div>
</div>
`
})
export class App {
optionlist = [{'name': '1'}, {'name': '2'}]
inputShow() {
this.inputFocus = true;
}
inputHide(){
this.inputFocus= false;
}
isHideList() {
return !this.inputFocus;
}
}
接近预期行为的一种方法是带走
(blur)="inputHide()"
<{1>}上的
但现在当我点击input
并点击input
和input
以外的任何地方时dropdown
不合同
仅当我点击dropdown
然后点击input
时,其他任何地方都会dropdown
合同
有人能给我一些见解吗?
由于
答案 0 :(得分:4)
收听窗口点击事件,仅在event.target
位于包装器外时隐藏下拉列表:
@Component({
selector: 'my-app',
template: `
<div #wrapper class="wrapper">
<input #input [(ngModel)]="searchText"
tabindex="0"
placeholder="name"
(focus)="inputShow()"
>
<div class="option-wrapper"
[hidden]="isHideList()"
tabindex="0"
(focus)="inputShow()"
>
<li class="options"
*ngFor="#option of optionlist">
<div >{{option['name']}}</div>
</li>
</div>
</div>
`
})
export class App {
@ViewChild('wrapper') wrapper:ElementRef;
@ViewChild('input') input:ElementRef;
@HostListener('window:click', ['$event'])
clickHandler(event) {
var parent = event.target;
while(parent != this.wrapper.nativeElement && parent != document) {
parent = parent.parentNode;
}
if(parent == document) {
this.inputHide();
}
}
optionlist = [{'name': '1'}, {'name': '2'}]
inputShow() {
this.inputFocus = true;
}
inputHide(){
this.inputFocus= false;
}
isHideList() {
return !this.inputFocus;
}
}