单击 div 中的按钮时如何在 div 上禁用 matRipple?
how to disable matRipple on a div when clicking buttons inside that div?
我正在用 angular 11
创建这个图片上传组件
我有一个 div
和 matRipple
的拖放区,因此每当用户拖放文件时,它都会显示连锁反应。在 div 里面,我有左右旋转的按钮。当我点击这些按钮时,拖放区 div 的涟漪效应也会被触发。
有没有办法禁用它?因此,如果用户单击 div 中的按钮,不会发生 div 的连锁反应?我认为通过将 event.stopPropagation()
添加到按钮事件处理程序它会停止它,但它没有。
这是我的组件:
<div class="container">
<div class="box" style="width: 264px; height: 264px;transition: transform 0.5s" [style.transform]="'rotate(' + this.imageRotation + 'deg)'">
<img style="max-width: 264px; max-height: 264px; position: relative" [src]="selectedFile?.src ? selectedFile?.src : previewImageUrl ? previewImageUrl : null" /></div>
<div class="box stack-top">
<div class="dropzone" comTuxinUpArea (fileDropped)="processFile($event)" matRipple>
<input type="file" id="fileDropRef" accept="image/jpeg,image/png,image/webp" (change)="processFile($event.target)" />
<h3 i18n>drag and drop file here</h3>
<h3 i18n>or</h3>
<label for="fileDropRef" i18n>Browse for file</label>
<div fxLayout="row" fxLayoutAlign="center center" id="rotate-div">
<button mat-icon-button *ngIf="this.selectedFile" (click)="rotateLeft()"><mat-icon>rotate_left</mat-icon></button>
<button mat-icon-button *ngIf="this.selectedFile" (click)="rotateRight()"><mat-icon>rotate_right</mat-icon></button>
</div>
</div>
</div>
旋转按钮事件处理程序:
rotateLeft() {
this.imageRotation+=90;
}
rotateRight() {
this.imageRotation-=90;
}
在 div 上使用 [matRippleDisabled]="someVariable"
。在您的按钮上,当您将鼠标悬停在按钮上时,您可以在 true 和 false 之间更改 someVariable 的值。
在你的按钮上使用:
(mouseenter)="someVariable=true" (mouseleave)="someVariable=false"
启用或禁用外部 div 的涟漪效应。
另一个解决方案有点棘手而且不那么花哨,默认情况下直接从模板禁用 matRipple 并手动处理父元素点击事件:
我的-app.component.html
<div *ngFor="let item of items; index as i" matRipple [matRippleDisabled]="true" (click)="toggleView(i)">
...
<button mat-button (click)="$event.stopPropagation(); doYourStuff()"></button>
</div>
我的-app.component.ts
@ViewChildren(MatRipple) public matRipples!:QueryList<MatRipple>;
public toggleView(i:number):void {
this.matRipples.get(i)!.launch({ centered: true });
}
它比 @rishabhsharma 的解决方案效果更好,因为即使在触摸屏(无鼠标,所以没有光标事件)设备上也能工作。
希望对大家有所帮助。
我正在用 angular 11
创建这个图片上传组件我有一个 div
和 matRipple
的拖放区,因此每当用户拖放文件时,它都会显示连锁反应。在 div 里面,我有左右旋转的按钮。当我点击这些按钮时,拖放区 div 的涟漪效应也会被触发。
有没有办法禁用它?因此,如果用户单击 div 中的按钮,不会发生 div 的连锁反应?我认为通过将 event.stopPropagation()
添加到按钮事件处理程序它会停止它,但它没有。
这是我的组件:
<div class="container">
<div class="box" style="width: 264px; height: 264px;transition: transform 0.5s" [style.transform]="'rotate(' + this.imageRotation + 'deg)'">
<img style="max-width: 264px; max-height: 264px; position: relative" [src]="selectedFile?.src ? selectedFile?.src : previewImageUrl ? previewImageUrl : null" /></div>
<div class="box stack-top">
<div class="dropzone" comTuxinUpArea (fileDropped)="processFile($event)" matRipple>
<input type="file" id="fileDropRef" accept="image/jpeg,image/png,image/webp" (change)="processFile($event.target)" />
<h3 i18n>drag and drop file here</h3>
<h3 i18n>or</h3>
<label for="fileDropRef" i18n>Browse for file</label>
<div fxLayout="row" fxLayoutAlign="center center" id="rotate-div">
<button mat-icon-button *ngIf="this.selectedFile" (click)="rotateLeft()"><mat-icon>rotate_left</mat-icon></button>
<button mat-icon-button *ngIf="this.selectedFile" (click)="rotateRight()"><mat-icon>rotate_right</mat-icon></button>
</div>
</div>
</div>
旋转按钮事件处理程序:
rotateLeft() {
this.imageRotation+=90;
}
rotateRight() {
this.imageRotation-=90;
}
在 div 上使用 [matRippleDisabled]="someVariable"
。在您的按钮上,当您将鼠标悬停在按钮上时,您可以在 true 和 false 之间更改 someVariable 的值。
在你的按钮上使用:
(mouseenter)="someVariable=true" (mouseleave)="someVariable=false"
启用或禁用外部 div 的涟漪效应。
另一个解决方案有点棘手而且不那么花哨,默认情况下直接从模板禁用 matRipple 并手动处理父元素点击事件:
我的-app.component.html
<div *ngFor="let item of items; index as i" matRipple [matRippleDisabled]="true" (click)="toggleView(i)">
...
<button mat-button (click)="$event.stopPropagation(); doYourStuff()"></button>
</div>
我的-app.component.ts
@ViewChildren(MatRipple) public matRipples!:QueryList<MatRipple>;
public toggleView(i:number):void {
this.matRipples.get(i)!.launch({ centered: true });
}
它比 @rishabhsharma 的解决方案效果更好,因为即使在触摸屏(无鼠标,所以没有光标事件)设备上也能工作。
希望对大家有所帮助。