Форма Angular 8 контролирует зависание при загрузке списка - PullRequest
1 голос
/ 28 июня 2019

Привет, я сталкиваюсь с одной проблемой в angular, как у меня есть страница, которая имеет базовую угловую форму, а также два независимых компонента, которые в основном загружают список из API, как комментарии [500+ records], posts [500 + records].

Проблема:

Когда при попытке ввода значения в формы во время загрузки списка в основном происходит, не может выполнить ключ / проверить / снять флажок / выбрать события.

После комментариев, только на странице, загруженной сообщениями, можно делать вещи в формах .

Это исключительное поведение?.

Я просто хочу отделить процесс, так как загрузка списка (посты, комментарии) не должна влиять на угловую форму / HTML-форму для ввода.

Пожалуйста, помогите мне решить эту проблему.

Мой код стекаблиц, такой как: https://stackblitz.com/edit/angular-ngfor-issue

Воспроизводится в Chrome [только большой набор данных] / IE11 .

Пробовал с trackBy, async pipe тоже ничего не помогло

component structure

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Мне удалось воспроизвести это отставание в IE.

Я реорганизовал ваш код, чтобы сделать его работоспособным. Если вы имеете дело с большим набором данных и отображением больших списков, кроме trackBy, вам также следует рассмотреть возможность использования ChangeDetectionStrategy.OnPush в качестве changeDetectionStrategy.

Вот как выглядит ваш переработанный код:

import { Component, ChangeDetectionStrategy } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Component({
  selector: 'app-comments',
  templateUrl: './comments.component.html',
  styleUrls: ['./comments.component.css'],
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class CommentsComponent {
  comments$: Observable<Array<any>> = this.http.get(`https://jsonplaceholder.typicode.com/comments`);

  constructor(private readonly http: HttpClient) { }

  trackyFn(item) {
    return item.id;
  }

}

Шаблон:

<h1>Comments</h1>
<div class="row">
    <div class="col-md-12" style="height: 250px; overflow:scroll">
        <table class="table table-hover">
            <thead>
                <tr>
                    <th>Id</th>
                    <th>Name</th>
                    <th>Email</th>
                    <th>Body</th>
                </tr>
            </thead>
            <tbody>
                <tr *ngFor="let comment of comments$ | async; trackBy:trackyFn;">
                    <td>{{comment.id}}</td>
                    <td>{{comment.name}}</td>
                    <td>{{comment.email}}</td>
                    <td>{{comment.Body}}</td>
                </tr>
            </tbody>
        </table>
    </div>
</div>

Точно так же вы можете выполнить рефакторинг PostsComponent.

И ваш AppComponent:

import { Component, ChangeDetectionStrategy } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AppComponent {
  name = 'Angular';
  registerForm: FormGroup;

  constructor(private readonly formBuilder: FormBuilder) { }

  ngOnInit() {
    this.registerForm = this.formBuilder.group({
      firstName: ['', Validators.required],
      lastName: ['', Validators.required],
      termsAgreed: [false],
      gender: ['male'],
      std: [10]
    });
  }

}

Изменения, которые я сделал:

  1. Использовал changeDetection: ChangeDetectionStrategy.OnPush, во всех компонентах. - Главный фактор повышения производительности, поскольку Angular выполняет меньше циклов CD.
  2. Используется async в шаблонах вместо ручного subscribe ing и unsubscribe ing из Observable и Subscription соответственно. - Просто чтобы сделать код чище.

Чтобы увидеть, как улучшается производительность, если вы пользователь Windows, нажмите и удерживайте любую клавишу на клавиатуре, пока вы находитесь в поле Текстовая форма, и посмотрите, плавно ли отображается ввод.


Вот Рабочий образец StackBlitz для вашей ссылки.

0 голосов
/ 28 июня 2019

Я не могу воспроизвести замораживание в вашем StackBlitz.Я считаю, что это может быть скрыто из-за способа обработки кода на этом сайте с помощью индикатора загрузки.Тем не менее, из вашего описания звучит так, как будто проблема заключается в фактическом рендеринге 500+ элементов в DOM, если он зависает.Попробуйте взглянуть на стратегию обнаружения угловых изменений: https://blog.ninja -squad.com / 2018/09/27 / angular-performancemances-part-4 /

Я бы поэкспериментировал с обнаружением изменений переключенияOnPush для обоих компонентов списка, чтобы увидеть, есть ли разница.

...