【问题标题】:Change how content is displayed based on screen size in Angular 4在 Angular 4 中根据屏幕大小更改内容的显示方式
【发布时间】:2018-03-30 16:47:21
【问题描述】:

在更大的屏幕尺寸上,我有 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>

【问题讨论】:

    标签: html angular size screen display


    【解决方案1】:

    您必须使用客户端窗口大小的可观察对象!

    Here 是怎么做到的! 或者你可以开始使用flex-layout 来获取角度,我觉得这个库很有帮助。

    编辑:

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

    your-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)
          }
        });
      }
    }
    

    【讨论】:

    • 我已经在使用弹性布局了。我的问题是如何将布局更改为选项卡控件。我不能简单地改变内容的位置,我需要将它“注入”到选项卡控件布局中。
    • 你的回答很有趣。我不知道能够根据屏幕大小执行代码。然而,这不是我想要解决这个问题的方法。
    • 好的!很高兴您发现了新事物!
    【解决方案2】:

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

    无论如何我都不需要为它们命名,因此只需删除名称即可解决我的问题。如果您需要名称,我正在考虑将 GUID 添加到生成 OnInit() 的名称中。基本上,请注意您的组件中没有具有多个渲染副本的 id 和名称,因为它们需要是唯一的。

    【讨论】:

    • 我意识到我没有在我的问题中提到单选按钮。下次我会做一个plunker的例子
    猜你喜欢
    • 2016-02-10
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多