Angular 5-> 8升级后,“材质”对话框显示在DOM中,但不显示在屏幕上

问题描述 投票:0回答:1

完成从Angular 5到8的升级后,除了“材质”模态对话框外,几乎所有东西都可以使用。使用浏览器调试器,我们可以看到该结构位于DOM中,但它们并未绘制出来。我们最初使用的是No-op动画师模块。当我将其切换到BrowserAnimations模块时,将出现该动画的对话框,但是一旦动画完成,它就会在视觉上消失。它仍然在那里,您可以与它进行部分交互-如果单击应显示“关闭”按钮的位置,则对话框将关闭。 (您可以这样说是因为“玻璃” /灰色屏幕盖消失了。)我们已经修复了所有单元测试(2500多个),它们运行100%干净,并且大多数应用程序均按预期工作。只是对话框在视觉上消失了。

我已经尝试过的事情:

  1. 通过Chrome调试工具将各项的z-index设置为荒谬的值(25000)
  2. 通过调试器显式设置CSS显示属性以“阻止”各种元素
  3. 将CSS可见性明确设置为“可见”
  4. 将CSS不透明度显式设置为“ 1”
  5. 已验证对话框组件均在其所在模块的EntryComponents中列出(并且该模块已导入到主应用程序模块中]

[Angular 5一切正常,这绝对是升级的副作用。我怀疑这可能是Material与我们正在使用的其他模块的相互作用,该模块以前很好地一起发挥作用,但现在不再起作用。但是,我不确定这可能是什么或如何解决。为此,这是我们正在使用的(package.json extact):

  "dependencies": {
    "@angular/animations": "^8.2.1",
    "@angular/cdk": "^8.1.2",
    "@angular/common": "^8.2.1",
    "@angular/compiler": "^8.2.1",
    "@angular/core": "^8.2.1",
    "@angular/flex-layout": "^8.0.0-beta.27",
    "@angular/forms": "^8.2.1",
    "@angular/material": "^8.1.2",
    "@angular/material-moment-adapter": "^8.1.2",
    "@angular/platform-browser": "^8.2.1",
    "@angular/platform-browser-dynamic": "^8.2.1",
    "@angular/router": "^8.2.1",
    "@ngx-translate/core": "^11.0.1",
    "@ngx-translate/http-loader": "^4.0.0",
    "bootstrap": "^4.3.1",
    "classlist.js": "^1.1.20150312",
    "core-js": "^3.2.1",
    "hammerjs": "^2.0.8",
    "jwt-decode": "^2.2.0",
    "moment": "^2.24.0",
    "ngx-bootstrap": "^5.1.1",
    "pdfjs-dist": "^2.1.266",
    "rxjs": "^6.5.2",
    "ts-helpers": "^1.1.2",
    "tslib": "^1.10.0",
    "velocity-animate": "^1.5.2",
    "web-animations-js": "^2.3.2",
    "zone.js": "~0.9.1"
  },

在我的app.module.ts中,我有以下内容:

@NgModule({
    imports: [
        <<<snip>>> ModalTemplatesModule, 
        BrowserAnimationsModule, <<<snip>>>    ],

然后将ModalTemplatesModule定义为:

const modalTemplates: any[] = [
    ModalTimeoutComponent,
    ConfirmActionModalComponent,
    // etc...
];

@NgModule({
    imports: [
        SharedModule,
        ReactiveFormsModule,
        FormsModule,
        CommonComponentsModule,
        CommonNonComponentsModule
    ],
    declarations: modalTemplates,
    exports: modalTemplates,
    providers: [
        ConfigService,
        TransactionService
    ],
    entryComponents: modalTemplates
})
export class ModalTemplatesModule {}

我们确实为所有模态创建了一个包装器,然后将特定的对话框内容放入其中。因此,如果代码有问题,则可能在此类中。但这很简单...ModalWrapper模板:

<div fxLayoutAlign="center center" fxLayout="column" fxFlexFill>
    <div class="modal-wrapper full-width" fxLayout="column" fxLayoutAlign="center center">
        <div *ngIf="showCloseButton" class="full-width" fxLayoutAlign="end end" fxLayout="column" fxFlex="none">
            <button id="closeButton" class="close-button-outside" (click)="close()" #closeButton>
            <span fxLayout="row" fxLayoutAlign="start center" fxLayoutGap="0.5rem">
                <i class="icon-close-hover"></i>
                <span>{{"common.buttons.close" | translate}}</span>
            </span>
            </button>
        </div>
        <ng-content></ng-content>
    </div>
</div>

实际标签位于通过放置在包装器中的组件的模板内。

ModalWrapperComponent

@Component({
    selector : 'modal-wrapper',
    templateUrl: './modal-wrapper.component.html',
    styleUrls: ['./modal-wrapper.component.scss']
})
export class ModalWrapperComponent {
    @Output() onClose: EventEmitter<void> = new EventEmitter<void>();
    @Input() showCloseButton: boolean = true;

    constructor() {}

    close(): void {
        this.onClose.emit();
    }
}

在这一点上,我对于它为什么消失以及如何解决它的想法已经不多了。希望其他人遇到此问题并认识到问题并知道如何解决!

更新:如果我使用适用于Chrome的WAVE辅助功能插件并“禁用所有CSS”,则对话框元素的确会出现在屏幕底部。因此,这表明这是一个与样式有关的问题。还有其他方法可以“隐藏”吗?

angular angular-material modal-dialog angular-upgrade
1个回答
0
投票

最后弄清楚了。在Angular 5代码中,我们有一个material-overrides.scss文件。在其中,有人添加了以下样式:

mat-dialog-container {
  opacity: 0;
  @include transform(translate3d(0, 3.5rem, 0));
  @include transition(opacity $animation-time, -webkit-transform $animation-time);
}

当我注释不透明度:0时,我的对话框开始出现。不知道为什么我们在Angular 5中(材料2.0.0-beta)具有此功能。当时似乎没有引起任何问题,但现在确实如此。无论如何,问题解决了。

© www.soinside.com 2019 - 2024. All rights reserved.