gpt4 book ai didi

Angular 2 Dart : How to detect click on everything but element?

转载 作者:太空狗 更新时间:2023-10-29 17:26:04 25 4
gpt4 key购买 nike

在一个组件中包含许多不同组件的应用程序中,我有一个自定义自动建议框。如果用户单击自动建议框以外的任何地方(或包含自动建议框的元素),则应关闭该框。

这就是我在 jQuery 中要做的:

$(document).on('click','body',function(e) {
if(e.target!='.suggestbox' && $(e.target).parent('.suggestbox').length <1 ) {
$('.suggestbox').remove();
}
});

但是在我的 Angular Dart 模板中我有:

index.html:

<body>
<my-app>
// sub component
// sub sub component
</my-app>
</body>

我可以想到检测对 my-app 组件中最顶层包装器的点击并将操作发送到子组件的可能性,但这仍然不是主体点击。

解决这个问题的最佳方法是什么?

最佳答案

<button (click)="show = true">show dropdown</button>
<div #suggestbox *ngIf="show">...</div>
class AutoSuggestComponent {
bool show = false;

@ViewChild('suggestbox') ElementRef suggestbox;

@HostListener('document:click', [r'$event'])
onDocumentClick(MouseEvent e) {
if((suggestbox.nativeElement as HtmlElement).contains(e.target)) {
// inside the dropdown
} else {
// outside the dropdown
}
}
}

未经测试,button 和 div 元素只是组件外观的粗略近似值。

另见 How can I close a dropdown on click outside?

更新

Angular 5 不支持全局事件处理程序,例如 document:...

改用命令式变体

class AutoSuggestComponent implements AfterViewInit, OnDestroy {
bool show = false;

@ViewChild('suggestbox') ElementRef suggestbox;

StreamSubscription _docClickSub;

@override
void ngAfterViewInit() {
_docClickSub = document.onClick.listen((e) {
if((suggestbox.nativeElement as HtmlElement).contains(e.target)) {
// inside the dropdown
} else {
// outside the dropdown
}
});
}

@override
void onDestroy() {
_docClickSub?.cancel();
}
}

关于 Angular 2 Dart : How to detect click on everything but element?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43941800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com