根据Angular 4

时间:2017-10-18 18:04:42

标签: html angular size screen display

在较大的屏幕尺寸上,我有3列内容。在较小的屏幕尺寸上,我想在带有3个标签的标签控件中显示内容。

我使用下面的html工作。问题是,如果我对组件绑定的数据进行更改,则不会更新组件的其他副本。因此,如果在屏幕较大时更改数据,则屏幕变小,它会正确切换到标签,但数据不会显示为更新。代码中的实际数据对象可以更新。

如何同步复制的组件以始终显示相同的组件?基本上,当一个人改变时,另一个人会模仿这些改变。或者,当屏幕较小时,是否有不同/更好的方法来实现在标签中显示内容的相同目标。



<div fxHide fxShow.gt-sm >
  <div>
    <h3>Column 1</h3>
    <custom-component1 
      [(data)]="data1">
    </custom-component1>
  </div>
  <div>
    <h3>Column 2</h3>
    <custom-component2 
      [(data)]="data2">
    </custom-component2>
  </div>
  <div>
    <h3>Column 3</h3>
    <custom-component3 
      [(data)]="data3">
    </custom-component3>
  </div>
  
  <mat-tab-group fxShow fxHide.gt-sm>
    <mat-tab label="Column 1">
      <div>
        <h3>Column 1</h3>
        <custom-component1 
          [(data)]="data1">
        </custom-component1>
      </div>
    </mat-tab>
    <mat-tab label="Column 2">
      <div>
        <h3>Column 2</h3>
        <custom-component2 
          [(data)]="data2">
        </custom-component2>
      </div>
    </mat-tab>
    <mat-tab label="Column 3">
      <div>
        <h3>Column 3</h3>
        <custom-component3 
          [(data)]="data3">
        </custom-component3>
      </div>
    </mat-tab>
  </mat-tab-group>
</div>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:6)

您必须使用客户端窗口大小的observable!

Here是怎么做到的! 或者你可以开始使用flex-layout作为角度,我发现这个库非常有帮助。

修改

以下是让数据观察屏幕宽度大小的代码:

您-component.component.ts

import { Component, AfterViewInit } from '@angular/core';
import { ObservableMedia, MediaChange } from '@angular/flex-layout';
import { Subscription } from 'rxjs/Rx';

@Component({
    selector: 'app-your-component',
    templateUrl: './your-component.component.html',
    styleUrls: ['./your-component.component.css']
})
export class YourComponentComponent implements AfterViewInit {

    // Subscription of the observer of the screen size
    mediaQuery$: Subscription;

    // The active media query (xs | sm | md | lg | xl)
    activeMediaQuery: string;

    constructor(
        private observableMedia: ObservableMedia
    ){}

    ngAfterViewInit () {

        this.mediaQuery$ = this.observableMedia.subscribe( (change: MediaChange) => {
            this.activeMediaQuery = `${change.mqAlias}`;
            if (this.activeMediaQuery === 'xs' || this.activeMediaQuery === 'sm') {
                // Here goes code for update data in xs or sm (small screen)
            } else {
                // Here goes code for update data in gt-sm (bigger screen)
            }
        });
    }
}

答案 1 :(得分:0)

我解决了我的问题。我发现我确实只是在两个显示器类型之间保持单选按钮和复选框同步时遇到了问题。事实证明存在问题,因为无线电按钮组被命名,并且它不喜欢有两个具有相同名称的组。

我无论如何都不需要它们,所以简单地删除名称就解决了我的问题。如果你需要名字,我正在考虑为生成OnInit()的名称添加一个GUID。基本上要小心,您的组件中没有具有多个渲染副本的ID和名称,因为它们必须是唯一的。