【发布时间】:2020-04-22 06:10:57
【问题描述】:
我知道这方面有无数的问题,我尝试了所有解决方案,但没有一个适合我的需求。尝试过的指令,直接在我的组件中尝试过,但一次都没有用。
所以我的情况是这样的;我有一个表格视图,在每个表格视图的末尾,您可以通过单击一个图标来打开一个小下拉列表。弹出的下拉菜单是一个小组件。所以在我的父组件中它看起来像这样;
<tbody>
<tr *ngFor="let rows of subscriptionTable.data; let i = index;">
<td *ngFor="let cell of subscriptionTable.data[i].data">
<!-- Table actions -->
<div *ngIf="cell.actions && cell.actions.length > 0">
<app-dropdown
[actions] = cell.actions
(onActionClicked) = "handleSubscriptionAction($event, i)"
>
</app-dropdown>
</div>
</td>
</tr>
</tbody>
所以我正在渲染多个看起来像这样的子应用下拉组件;
<div class="fs-action">
<div class="fs-action__dots" (click)="openActionSheet($event)">
<span class="fs-action__dot"></span>
<span class="fs-action__dot"></span>
<span class="fs-action__dot"></span>
</div>
<ul class="fs-action__list">
<li
class="fs-action__item"
*ngFor="let action of actions; let i = index;"
(click)="actionClicked( $event, i )"
[ngClass]="{'fs-action__item--danger': action.type === 'destructive' }"
>
{{ action.label }}
</li>
</ul>
</div>
我现在想要做的是,只要我在 fs-action 元素外部单击,下拉菜单就会消失。我想在app-dropdown 组件中执行此操作,然后与该组件相关的所有内容都在同一个地方。
但是,只要我附加了指令或其他任何内容,hostlistener 就会为每一行添加。然后,每个外部点击都会被触发多次。检查我是否在操作元素之外单击会成为一种负担,因为它会为所有其他 hostlisteners 呈现 false,而对于处于活动状态的元素呈现 true。
这个问题在这个 stackblitz 中得到了说明; https://stackblitz.com/edit/angular-xjdmg4
我评论了导致dropdown.component.ts内部问题的部分;
public onClickOutside( event ) {
// It executes 3 times, for each of the items that is added
// Even when clicking inside the dropdown, it calls this function
console.log("click")
}
【问题讨论】:
-
当然,会在一个小时左右尝试完成!目前不在办公室。
-
您应该可以使用
HostListener来处理类似的事情并附加相应的事件。 -
找到了一些时间,这里是一个说明问题的堆栈闪电; stackblitz.com/edit/angular-xjdmg4
标签: javascript angular angular-directive