【问题标题】:Angular Material 2 Table Mat Row Click event also called with button click in Mat CellAngular Material 2 Table Mat Row Click 事件也通过 Mat Cell 中的按钮单击调用
【发布时间】:2017-11-01 09:11:45
【问题描述】:

我是材料 2 的新手,我已经实现了 mat table,其中我在行上单击事件以打开对话框,最后一列“操作”中还有一个菜单按钮,但单击按钮它也会打开对话框框而不是打开菜单。

表格

    <mat-table #table [dataSource]="dataSource" matSort  (matSortChange)="sortData($event)">
    <ng-container matColumnDef="id">
          <mat-header-cell *matHeaderCellDef > No. </mat-header-cell>
          <mat-cell *matCellDef="let element"> 
              <mat-checkbox checked='true'></mat-checkbox>
          </mat-cell>
    </ng-container>
    <ng-container matColumnDef="unit_num">
        <mat-header-cell *matHeaderCellDef  mat-sort-header="unit_num"> Unit No. </mat-header-cell>
        <mat-cell *matCellDef="let element"> {{element.unit_num}} </mat-cell>
    </ng-container>
    <ng-container matColumnDef="unit_type">
        <mat-header-cell *matHeaderCellDef mat-sort-header="unit_type"> Unit Type </mat-header-cell>
        <mat-cell *matCellDef="let element"> {{element.unit_type}} </mat-cell>
    </ng-container>
    <ng-container matColumnDef="shares">
        <mat-header-cell *matHeaderCellDef mat-sort-header="shares"> Shares </mat-header-cell>
        <mat-cell *matCellDef="let element"> {{element.shares}} </mat-cell>
      </ng-container>
    <ng-container matColumnDef="sections">
        <mat-header-cell *matHeaderCellDef>Section </mat-header-cell>
        <mat-cell *matCellDef="let element"> {{element.sections.section_type}} </mat-cell>
    </ng-container>
    <ng-container matColumnDef="buildings">
        <mat-header-cell *matHeaderCellDef >Building </mat-header-cell>
        <mat-cell *matCellDef="let element"> {{element.buildings.buildingname}} </mat-cell>
    </ng-container>
    <ng-container matColumnDef="_id">
        <mat-header-cell *matHeaderCellDef> Action </mat-header-cell>
        <mat-cell *matCellDef="let element"> 
          <button mat-button [matMenuTriggerFor]="menu"><mat-icon>more_vert</mat-icon>
          </button>
            <mat-menu #menu="matMenu">
              <button mat-menu-item (click)="edit(element._id)">Edit</button>
              <button mat-menu-item (click)="gotoFamily(element)">Go to current family</button>
              <button mat-menu-item (click)="createNewFam(element)">Create new family</button>
              <button mat-menu-item (click)="openDeleteDialog(element._id)">Delete</button>              
            </mat-menu>
        </mat-cell>
    </ng-container>
    <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
    <mat-row *matRowDef="let row; columns: displayedColumns; let index=index;" mat-ripple style="position:relative;" (click)="edit(row._id,$event)"></mat-row>
    </mat-table>
  <mat-paginator [length]="count"
    [pageSize]="pageSize"
    [pageSizeOptions]="pageSizeOptions"
    (page)="pageSide($event)">
  </mat-paginator>

实际上应该只打开菜单

【问题讨论】:

  • 尝试将$event.stopPropagation() 添加到更深层次的点击处理程序之一(例如在单元格上)。
  • @Brian,你解决了吗?我想知道你是怎么解决的。如果可能,请分享您的解决方案。
  • @IsakLaFleur 我只是编辑之一;我没有解决或回答这个问题,我只是复制编辑它。
  • @Nasiruddin,你解决了吗?可以分享一下吗?
  • 我已经使用标志变量完成了它并关闭了其他下拉列表

标签: angular angular-material2 angular-cdk xmltable onrowclick


【解决方案1】:

我刚刚遇到了同样的问题,并使用 Will 对原始帖子的评论解决了它,将带有 $event.stopPropagation 的单击处理程序添加到单元格作为按钮的直接父级。我会在此处添加它作为解决方案,以防其他人来这里寻找相同的答案。

我有一个材料数据表,其中该行有一个单击事件,可以带您进入编辑模式,最后一列包含一个带有删除操作的按钮。显然你不想同时触发删除和编辑!

这是我用来解决问题的结构:

片段

// Row definition containing a click event
<mat-row *matRowDef="let row; columns: displayedColumns;" (click)="onEdit(row.id)"></mat-row>

// Definition for the cell containing the button
<ng-container matColumnDef="buttons">
    <mat-header-cell *matHeaderCellDef></mat-header-cell>
    <mat-cell *matCellDef="let group" (click)="$event.stopPropagation()">
        <button mat-button (click)="onDelete(group.id)">
            <mat-icon>delete</mat-icon>
        </button>
    </mat-cell>
</ng-container>

全表代码

<mat-table #table [dataSource]="dataSource" matSort>
    <ng-container matColumnDef="name">
        <mat-header-cell *matHeaderCellDef mat-sort-header>Name</mat-header-cell>
        <mat-cell *matCellDef="let group">{{ group.name }}</mat-cell>
    </ng-container>
    <ng-container matColumnDef="description">
        <mat-header-cell *matHeaderCellDef>Description</mat-header-cell>
        <mat-cell *matCellDef="let group">{{ group.description }}</mat-cell>
    </ng-container>
    <ng-container matColumnDef="buttons">
        <mat-header-cell *matHeaderCellDef></mat-header-cell>
        <mat-cell *matCellDef="let group" (click)="$event.stopPropagation()">
            <button mat-button (click)="onDelete(group.id)">
                <mat-icon>delete</mat-icon>
            </button>
        </mat-cell>
    </ng-container>

    <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
    <mat-row *matRowDef="let row; columns: displayedColumns;" (click)="onEdit(row.id)"></mat-row>
</mat-table>

再次感谢 Will Howell 提供的解决方案。

【讨论】:

  • 谢谢这对某人有帮助.. 我的解决方案有点复杂,它包括各种调用
  • 谢谢,&lt;mat-cell (click)="$event.stopPropagation()"&gt; 完美运行。
  • 当我在按钮元素上使用垫子按钮时,单击事件不起作用,当我不使用垫子按钮时,我没有收到第一次点击事件,但之后我收到了所有点击事件。你能想到我面临的一些问题吗? @lordchancellor
  • (click)="$event.stopPropagation()" 完美运行!谢谢
  • (click)="$event.stopPropagation() 在单击行时打开扩展非常有效,但是当我单击每一行的按钮时,有什么方法可以打开该行。因为我有一个EDIT 按钮,我想点击它来打开扩展部分
【解决方案2】:

我认为当前接受的答案存在缺陷。上述解决方案使部分行无法点击。为了保持整行可点击,您可以将 $event 传递给 html 中的组件并从组件调用 stoppropogation:

html:

<mat-cell *matCellDef="let element" class="rightalign">
    <button mat-raised-button color="primary" (click)="openDialog(element, $event)"><mat-icon>edit</mat-icon> Breyta</button>
  </mat-cell>

组件:

openDialog(data, event): void {
event.stopPropagation();
const editDialogRef = this.dialog.open(EditClientComponent, {
  data: data
});

}

【讨论】:

  • 是的,我已经这样做了,因为在我的情况下,需要调用服务。
  • 行的哪一部分不可点击?
  • @chrisinmtown 取决于单元格的 html,但在某些情况下,按钮不会填满整个单元格。该单元格的其余部分不会将事件传播到该行,因此它在带有按钮的单元格的空白部分中显示为不可点击。 (但你现在可能已经发现了)
猜你喜欢
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2021-06-10
  • 2020-06-19
  • 2019-10-10
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
相关资源
最近更新 更多