我正在處理一個具有大量下拉菜單的應用程序,我希望能夠在發生點擊時發生點擊時關閉下拉菜單。Angular:使用ngFor檢測div內的單擊事件
我發現了一些很好的解決方案,但是他們都沒有處理在其中有ngFor的情況,當我在ngFor中記錄單擊事件目標時,我得到了元素,但是這個元素沒有任何父元素。我無法用'find'或'contains'來檢測它。
有人有解決方案來檢測此目標是否是下拉列表的一部分?
指令,其中我調用指令
<div (clickOutside)="onClickedOutside($event)">
<ul>
<li *ngFor="let item of itemsList" (click)="selectItem(item)">
<span class="item">
{{item.name}}
</span>
</li>
</ul>
</div>
當我點擊item.name,執行console.log(電流)
import {
Directive,
ElementRef,
EventEmitter,
Input,
OnInit,
Output,
SimpleChange
} from '@angular/core';
@Directive({selector: '[clickOutside]'})
export class ClickOutside implements OnInit {
@Output() clickOutside:EventEmitter<Event> = new EventEmitter<Event>();
constructor(private _el:ElementRef) {
this.onClickBody = this.onClickBody.bind(this);
}
ngOnInit() {
document.body.addEventListener('click', this.onClickBody);
}
private onClickBody(e:Event) {
if (!this.isClickInElement(e)) {
this.clickOutside.emit(e);
}
}
private isClickInElement(e:any):boolean {
var current = e.target;
do {
console.log(current);
if (current === this._el.nativeElement) {
return(true);
}
current = current.parentNode;
} while (current);
return false;
}
}
實施例;返回我的兩行
<span>Item</span>
<li>
<span>Item</span>
</li>
你還可以發佈一些你的代碼嗎? – dfsq
我不明白問題所在。 Angular2中沒有虛擬DOM。 –
問題是我無法確定點擊是否發生在this._el.nativeElement中。當你點擊一個ngFor項時,Contains(),find()和parentNode不起作用。 – ThomasP1988