Ionic4 / mobile Safari - 如果 angular-cropper 组件存在,模式按钮不会触发点击事件

Ionic4 / mobile Safari - Buttons on modal are not firing click event if angular-cropper component is present

我正在开发基于 ngx-rocket 初学者工具包的 Ionic 4 应用程序。

我有一个带有 angular-cropper 元素的模式 window 和一个带有“关闭”和“应用”按钮的工具栏。

这是模态的 html:

<ion-header color="c-dark-gray" no-border>
    <ion-toolbar no-padding color="c-dark-gray">
        <ion-buttons slot="start">
            <ion-button fill="clear" no-margin no-padding text-center (click)="dismiss()">
                <ion-icon slot="icon-only" name="close" color="light"></ion-icon>
            </ion-button>
        </ion-buttons>

        <ion-title translate color="light">Move and Scale</ion-title>

        <ion-buttons slot="end">
            <ion-button fill="clear" no-padding no-margin (click)="apply()">
                <ion-text translate color="c-orange" text-uppercase>Apply</ion-text>
            </ion-button>
        </ion-buttons>
    </ion-toolbar>
</ion-header>

<ion-content color="c-dark-gray">
    <ion-grid no-padding no-margin>
        <ion-row>
            <ion-col no-padding no-margin>
                    <angular-cropper
                        #cropper
                        *ngIf="_image"
                        [cropperOptions]="_cropperjsSettings"
                        [imageUrl]="_image"
                        [ngClass]="{'round-cropper': _round}"></angular-cropper>
            </ion-col>
        </ion-row>
    </ion-grid>
</ion-content>

问题:在 Android 和浏览器(chrome、FF 和 safari)上一切正常,但 仅在 iPhone 设备上的 Safari(在 5、7、8+ 上测试),按钮不会触发点击事件。实际上,我放置在模态页面、页眉、页脚、工具栏或内容中、裁剪器上方、下方,甚至是其顶部的绝对定位覆盖的任何按钮或可点击元素都不起作用,并且仅在 iPhone 设备(Safari)。模态框上的 cropper 元素工作正常。

此外,按钮是可访问和可点击的 - 它们与点击进行视觉交互,在检查器中我可以看到 类 在点击按钮元素时移动它们。但由于某种原因,没有点击事件发送到应用程序,点击处理程序也不是 运行。如果我删除 angular-cropper 元素,按钮将正常工作。

我试过将模式转换为弹出窗口,但得到了类似的结果(按钮未触发点击事件)。 我还没有尝试过的一件事是为裁剪设置一个完整的路由页面,但这不是一个可接受的解决方案,设计明智。

我还创建了一个带有类似页面和模态的小型 ionic 侧边菜单测试应用程序,但一切都很好,所以这不是 Ionic 在模态上不支持裁剪器的问题。请注意,整个小工具在 V3 中运行良好。问题发生在最新的 Ionic4 上。

我错过了什么?有没有我没有导入的模块?欢迎任何想法或线索。

打开模态的代码:

 async cropBanner(ev: any) {
        const modal = await this.modal.create({
            component: ModalImageCropComponent,
            componentProps: {
                event: ev,
                ratio: 3 /4
            },
            showBackdrop: false
        });

        modal.onDidDismiss()
            .then((evMod: OverlayEventDetail<any>) => {
                this._bannerInput.getInputElement()
                    .then((val: HTMLInputElement) => {
                        log.debug('resetting input');
                        val.value = null;
                    });
            });
        await modal.present();
}

和模态的 ngModule 声明:

@NgModule({
  declarations: [
    ModalImageCropComponent
  ],
  exports: [
    ModalImageCropComponent
  ],
  entryComponents: [
    ModalImageCropComponent
  ],
  imports: [
    CommonModule,
    IonicModule,
    AngularCropperjsModule
  ]
})

包:

离子信息

Ionic:

   ionic (Ionic CLI) : 4.10.3

System:

   NodeJS : v10.15.1
   npm    : 6.8.0
   OS     : macOS High Sierra

ng 版本

Angular CLI: 7.3.1
Node: 10.15.1
OS: darwin x64
Angular: 7.2.4

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.13.1
@angular-devkit/build-angular     0.13.1
@angular-devkit/build-optimizer   0.13.1
@angular-devkit/build-webpack     0.13.1
@angular-devkit/core              7.3.1
@angular-devkit/schematics        7.3.1
@angular/cli                      7.3.1
@ngtools/webpack                  7.3.1
@schematics/angular               7.3.1
@schematics/update                0.13.1
rxjs                              6.4.0
typescript                        3.2.4
webpack                           4.29.0

npm 列表 | grep离子

├─┬ @ionic-native/core@5.0.0
├─┬ @ionic-native/splash-screen@5.0.0
├─┬ @ionic-native/status-bar@5.0.0
├─┬ @ionic/angular@4.0.2
│ ├─┬ @ionic/core@4.0.2
│ │ └── ionicons@4.5.5
├─┬ @ionic/v4-migration-tslint@1.7.0
├── cordova-plugin-ionic-keyboard@2.1.3
├── cordova-plugin-ionic-webview@3.1.2

经过更多的挖掘,我仍然不知道为什么模态按钮在 Safari 上不起作用,但我怀疑过时的 angular-cropperjs 包不能处理 V4 阴影 DOM 正确。我考虑过自己更新包,但没有资源。

解决方案:根据此 SO post:angular-2-4-add-compiled-component-to-an-iframe,解决方法是 将 angular-cropperjs 元素动态放置在 iFrame 中.它需要对 iFrame 的样式进行一些调整,但成功了。