Я работаю над приложением с большим количеством выпадающих списков, я хотел бы иметь возможность закрыть выпадающий список, когда клик происходит за пределами этого.Угловое: Обнаружение события щелчка внутри div с ngFor внутри
Я нашел несколько хороших решений, но ни один из них не обрабатывал случай наличия ngFor в нем, когда я регистрирую цель события click в ngFor, я получаю элемент, но у этого нет родителя. Я не могу обнаружить его с помощью «find» или «contains».
У кого-нибудь есть решение определить, является ли эта цель частью раскрывающегося списка?
директива
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;
}
}
Пример где я назвать директиву
<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 (ток); возвращает мне две строки
<span>Item</span>
<li>
<span>Item</span>
</li>
Можете ли вы также опубликовать часть своего кода? – dfsq
Я не понимаю, в чем проблема. В Angular2 нет виртуального DOM. –
Проблема заключается в том, что я не могу сказать, произошел ли щелчок в this._el.nativeElement или нет. Contains(), find() и parentNode не работают, когда вы нажимаете на элемент ngFor. – ThomasP1988