Angular 8 добавить класс после загрузки страницы Ошибка: ExpressionChangedAfterItHasBeenCheckedError - PullRequest
0 голосов
/ 21 ноября 2019

Как видно из заголовка, я пытаюсь добавить класс к элементу div после загрузки страницы! У меня есть условие isTrue и угловая функция ngAfterViewInit(), которая выполняется после загрузки страницы, делая значение isTrue равным true, затем добавляя класс hideOnLoad. Конечно, я мог бы использовать стандартные javascript или jquery, но я должен делать это угловым способом. По сути, конечный результат должен состоять в том, что div.index-logo-wrapper постепенно исчезает после загрузки страницы. Моя идея состояла в том, чтобы добавить класс после его загрузки, который постепенно уменьшает opacity Ваш ввод очень ценится.

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-index-section',
  templateUrl: './index-section.component.html',
  styleUrls: ['./index-section.component.scss']
})
export class IndexSectionComponent implements OnInit {
  isTrue: boolean = false;
  public innerWidth: any;
  constructor() { }

  ngOnInit() {
  }

  ngAfterViewInit() {
    this.innerWidth = window.innerWidth;
    if (this.innerWidth < 1000) {
      this.isTrue = true;
      alert(this.isTrue);
    }
  }
}
<section class="index-section">
  <div class="index-logo-wrapper" [class.hideOnLoad]="isTrue">
    <figure>
      <img src="assets/icons/logo_mobile.svg" alt="urbanwheels logo">
    </figure>
  </div>
  <div class="index-media-wrapper">
    <div class="media-container">
      <iframe src="https://player.vimeo.com/video/128014070?autoplay=1&color=ffffff&title=0&byline=0&portrait=0" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe>
      <p>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Itaque contra est, ac dicitis; Duo Reges: constructio interrete. Videsne quam sit magna dissensio?
      </p>
    </div>
  </div>
</section>

Это ошибка в моей консоли:

enter image description here

Ответы [ 4 ]

1 голос
/ 21 ноября 2019

Вы не должны изменять вещи, связанные с привязками внутри угловых хуков, потому что это мешает процессу обнаружения изменений. Рассмотрите обнаружение изменений, как будто это мясорубка. Вы должны только попытаться изменить мясо до того, как оно войдет или после того, как оно выйдет - вы не можете изменить его в середине процесса.

Что вы можете сделать, это превратить его в поток RxJs и использовать его сasync труба в шаблоне. Таким образом, Angular узнает, что что-то изменилось во время обнаружения изменений, и выполнит повторную проверку, как только это будет сделано.

Или вы можете ввести ChangeDetectorRef и сделать this.changeDetectorRef.markForCheck() в тех местах, где вы изменили что-то, связанное с привязками в течение жизненного цикла. крючки. По сути, это то же самое, что и async pipe для вашего случая.

Это более общее предложение, вот решение для вашего конкретного случая, которое также работает с Angular Universal (рендеринг на стороне сервера):

import { DOCUMENT } from '@angular/common';
import { Component, Inject, OnInit } from '@angular/core';

@Component({
  selector: 'app-index-section',
  templateUrl: './index-section.component.html',
  styleUrls: ['./index-section.component.scss']
})
export class IndexSectionComponent {
  readonly isTrue: boolean;

  constructor(@Inject(DOCUMENT) {defaultView}: Document) {
    this.isTrue = !defaultView || defaultView.innerWidth < 1000;
  }
}

Конечно, на сервере не будет размера окна, но доступ к свойствам на window может привести к ошибкам в этой среде, и предпочтительно не использовать DOM API в вашем приложении Angular напрямую и в любом случае использовать абстракции через токены.

0 голосов
/ 21 ноября 2019

Вы динамически добавляете класс либо

<div class="index-logo-wrapper" [ngClass]="{'hideOnLoad':isTrue}">

или

<div class="index-logo-wrapper  {{isTrue ? 'hideOnLoad' : ''}}">
0 голосов
/ 21 ноября 2019

Как уже говорилось, вы можете использовать следующее решение:

<div class="index-logo-wrapper" [ngClass]="isTrue ? 'hideOnLoad' : ''">

Но мне больше нравится этот другой синтаксис, когда он для одного класса:

<div class="index-logo-wrapper" [class.hideOnLoad]="isTrue">

Это прощечитать и чище.

0 голосов
/ 21 ноября 2019

Вы можете добавить класс динамически, используя троичный оператор ?. Если isTrue, тогда добавьте hideOnLoad, в противном случае класс будет пуст:

<div class="index-logo-wrapper" [ngClass]="isTrue ? 'hideOnLoad' : ''">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...