Javascript 角度5:防止在选项卡之间更改时重新加载选项卡内容

Javascript 角度5:防止在选项卡之间更改时重新加载选项卡内容,javascript,angular,iframe,material-design,angular-material,Javascript,Angular,Iframe,Material Design,Angular Material,我正在使用Angular 5开发一个基于材质设计的管理后端。其中一个视图基于选项卡,第一个选项卡包含iframe。但是,当在不同选项卡之间进行更改,然后导航到包含iframe的第一个选项卡时,将重新加载iframe。目标是在选项卡之间切换,而无需重新加载其内容。我怎样才能做到这一点 房间详细信息.template.html <mat-card class="p-0"> <mat-tab-group> <mat-tab label="Vorschau"&g

我正在使用Angular 5开发一个基于材质设计的管理后端。其中一个视图基于选项卡,第一个选项卡包含iframe。但是,当在不同选项卡之间进行更改,然后导航到包含iframe的第一个选项卡时,将重新加载iframe。目标是在选项卡之间切换,而无需重新加载其内容。我怎样才能做到这一点

房间详细信息.template.html

<mat-card class="p-0">
  <mat-tab-group>
    <mat-tab label="Vorschau">
      <mat-card-content class="mt-1">
          <iframe src="https://......" width="100%" height="400px" frameborder="0"></iframe>
      </mat-card-content>
    </mat-tab>
    <mat-tab label="Einstellungen">
      <mat-card-content>
        <p class="mt-1">Sprache</p>
        <mat-radio-group fxLayout="column">
          <mat-radio-button [style.marginBottom]="'.5rem'" value="1">Deutsch</mat-radio-button>
          <mat-radio-button [style.marginBottom]="'.5rem'" value="2">Englisch</mat-radio-button>
          <mat-radio-button [style.marginBottom]="'.5rem'" value="3">Französisch</mat-radio-button>
        </mat-radio-group>
        <mat-divider class="mb-1 mt-1"></mat-divider>
      </mat-card-content>
    </mat-tab>
  </mat-tab-group>
</mat-card>

斯普拉奇

德国 恩利施 弗朗茨·西施
目前,该逻辑尚未在room details.component.ts.中实现。

您不能

当你路由一个组件时,一旦你离开它,你实际上就摧毁了它们

这意味着,当您返回到它时,您将再次创建它,从而加载它的所有HTML(包括您的IFrame)

也许您可以尝试使用非路由组件(我不记得tabs是保留组件实例还是销毁它,但我想说他们保留了它),或者将IFrame连接到上面的路由器出口,并将其定位为绝对(当路由与您想要的路由不匹配时,不要显示它)


我知道这对于不重新加载组件来说很重要,但是iFrame很旧,并且没有得到广泛的应用

由于没有直接的方法可以做到这一点,我们可以使用简单的变通方法。其想法是只使用mat选项卡显示标题,但内容来自另一个部分,该部分位于tab HTML组件的正下方(如下面使用的mat网格)。此内容可见性将根据选项卡选择进行更改

<mat-tab-group [selectedIndex]="selected.value"
               (selectedIndexChange)="selected.setValue($event)"
               (selectedTabChange)="tabChanged($event)">
 <mat-tab *ngFor="let tab of tabs; let index = index">
      <ng-template mat-tab-label>
          {{tab.label}} &nbsp;
          <i class="icon XXX" (click)="removeTab(index)"></i>
      </ng-template>

  </mat-tab>
</mat-tab-group>
<mat-grid-list>
<mat-grid-tile *ngFor="let tab of tabs; let index = index"
        [style.display]='tab.active? "inline" : "none"'
        [style.position]='tab.active? "static" : "absolute"'>

    <iframe id="tabframe-{{tab.id}}" [src]='tab.url' ></iframe>

</mat-grid-tile>
</mat-grid-list>
和tab.ts文件

export class Tab {
  label: string;
  url: SafeUrl;
  active: boolean;

  constructor(label: string) {
      this.label = label;
  }

}

显示您的代码和尝试…或者只使用常规div,通过
[hidden]=“condition”
显示/隐藏。不是
*ngIf
也会破坏和重新创建div。是的,但在这种情况下,它是多余的,因为选项卡已经在处理它了。这将是第二个选项,位于非路由制表符I tink之后,绝对定位之前。
export class Tab {
  label: string;
  url: SafeUrl;
  active: boolean;

  constructor(label: string) {
      this.label = label;
  }

}