首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ><mat-select>不附加<mat-options>到cdk-overlay-容器

<mat-select>不附加<mat-options>到cdk-overlay-容器
EN

Stack Overflow用户
提问于 2020-08-18 17:10:22
回答 1查看 1.7K关注 0票数 2

我遇到了一个奇怪的问题,那就是垫子的选择停止了。

我将使用应用程序和垫-选择将打开,让我选择一个选项。那我过会儿再来,它就不会开了。它的发生非常随机,而且是非常不可预测的。

我注意到,当我单击元素时,它仍然会追加aria-owns属性,并向该属性添加选项(见下文),但它不再将选项添加到cdk覆盖容器中。

控制台中没有任何浏览器错误。

编辑

我一直在关注Chrome工具中的性能监视器,CPU使用率总是很低,JS堆的大小也从未真正提高过。

这也发生在我们所有的垫子-选择,甚至在不同的网页。

Mat-选择代码

代码语言:javascript
复制
<mat-select [value]="column.source" class="bg-neutral-2 padding-2 line-height-4 border-radius-3 box-xs" placeholder="- select -" (selectionChange)="onColumnChange($event.value, columnIndex)">
    <mat-option class="font-size-1" value="ignore" *ngIf="column.source">- ignore -</mat-option>
    <mat-option class="font-size-1" *ngFor="let source of sortedSourceColumns" [value]="source.value" >{{source.name}}</mat-option>
</mat-select>

单击元素

当我单击元素时,它会将mat选项附加到mat-select aria-own属性,但是这些选项不会添加到cdk覆盖容器中。

mat-选择

代码语言:javascript
复制
<mat-select _ngcontent-c5="" class="bg-neutral-2 padding-2 line-height-4 border-radius-3 box-xs mat-select ng-tns-c7-6 mat-select-empty" placeholder="- select -" role="listbox" id="mat-select-4" tabindex="0" aria-label="- select -" aria-required="false" aria-disabled="false" aria-invalid="false" aria-multiselectable="false" aria-owns="mat-option-21 mat-option-22 mat-option-23 mat-option-24 mat-option-25 mat-option-26 mat-option-27 mat-option-28 mat-option-29 mat-option-30 mat-option-31 mat-option-32 mat-option-33 mat-option-34 mat-option-35 mat-option-36 mat-option-37" aria-activedescendant="mat-option-21"><div class="mat-select-trigger" aria-hidden="true" cdk-overlay-origin=""><div class="mat-select-value"><!----><span class="mat-select-placeholder ng-tns-c7-6 ng-star-inserted">- select -</span><!----></div><div class="mat-select-arrow-wrapper"><div class="mat-select-arrow"></div></div></div><!----></mat-select>

cdk-overlay-container

代码语言:javascript
复制
<div class="cdk-overlay-container"></div>

有什么想法会导致这种情况吗?

依赖关系

代码语言:javascript
复制
    "@angular/animations": "~7.0.0",
    "@angular/cdk": "^7.0.4",
    "@angular/common": "~7.0.0",
    "@angular/compiler": "~7.0.0",
    "@angular/core": "~7.0.0",
    "@angular/forms": "~7.0.0",
    "@angular/http": "~7.0.0",
    "@angular/material": "~7.0.4",
    "@angular/platform-browser": "~7.0.0",
    "@angular/platform-browser-dynamic": "~7.0.0",
    "@angular/router": "~7.0.0",
EN

回答 1

Stack Overflow用户

发布于 2020-09-24 14:24:06

对于任何其他遇到这种情况的人来说,在我的例子中,这最终是一个问题,就是使用单一spa在同一个页面上运行到有角度的应用程序,而这两个应用程序都使用了角度材料。

角材料使用cdk覆盖来附加选项,并且由于有多个应用程序,应用程序被混淆了添加选项到哪个覆盖层。

我通过添加一个自定义类来清理我的每个微前端的覆盖,并使用下面的代码修正了这个问题:

microfrontend-overlay-container.ts

代码语言:javascript
复制
import { OverlayContainer } from '@angular/cdk/overlay';

@Injectable()
export class MicrofrontendOverlayContainer extends OverlayContainer {
  protected _createContainer(): void {
    const containerClass = 'cdk-overlay-container';
    const previousContainers = this._document.getElementsByClassName(containerClass);

    // If there is already a container (can happen in a Microfrontend scenario with
    // multiple self-contained Angular apps on the same website), reuse that. But
    // clean it up because it could be created while transitioning from server
    // to client (Angular Universal) and may be stale. Remove any additional containers.
    for (let i = 0; i < previousContainers.length; i++) {
      while (i === 0 && previousContainers[i].firstChild) {
        previousContainers[i].removeChild(previousContainers[i].firstChild);
      }

      if (i > 0 && !!previousContainers[i].parentNode) {
        previousContainers[i].parentNode.removeChild(previousContainers[i]);
      }
    }

    if (previousContainers.length > 0) {
      this._containerElement = previousContainers[0] as HTMLElement;
      return;
    }

    const container = this._document.createElement('div');
    container.classList.add(containerClass);
    this._document.body.appendChild(container);
    this._containerElement = container;
  }
}

app.module.ts

将其添加到提供者数组中:

代码语言:javascript
复制
{ provide: OverlayContainer, useClass: MicrofrontendOverlayContainer }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63473475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档