Низкая производительность при вводе материала чипа - PullRequest
0 голосов
/ 02 октября 2018

Я использую компонент Angular Material Chip для отображения микросхем с полем ввода ниже, чтобы пользователи могли добавлять новые микросхемы (ПРИМЕЧАНИЕ: это в диалоговом компоненте).Это работает просто отлично;тем не менее, производительность кажется ОЧЕНЬ низкой: как к тому времени, когда я набираю слово для нового чипа и нажимаю либо [ENTER], либо [COMMA], поле ввода остается пустым, имеется секунда или две задержки, а затемпоявляется чип (текст, который я набрал, на самом деле никогда не появляется в поле ввода при вводе, если я набираю очень медленно).

Я бы не подумал, что это как-то связано с моим ноутбуком (я работаю на совершенно новом MacBook Pro 2018 с 32 ГБ ОЗУ и процессором i9, так что я получил питание от вау-зоопарка).И все остальное на сайте очень отзывчиво (даже мой сервер звонит).Это почти похоже на то, что сам компонент замедляется, поскольку проверяет команду [COMMA] или [ENTER].

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

** edit.component.html **

<div class="edit-container">
  <h3 mat-dialog-title>{{ this.getDateInfo() }}</h3>
  <form class="mat-dialog-content" #formControl="ngForm">
    <div>
      <label>Page: </label><a href="/page/{{ this.dataModel.pageid }}">{{ this.dataModel.pageid }}</a>
    </div>
    <div>
      <label>Value: </label><span>{{ getAmountInfo() }}</span>
    </div>
    <div class="mt10">
      <label>Entry Words:</label>
      <p>{{ this.dataModel.words.join(' ') }}</p>
    </div>
    <div>
      <label class="mb5">Categories:</label>
      <mat-chip-list #categoryList class="mt5 mb5">
        <mat-chip *ngFor="let c of this.dataModel.categories" color="primary" [removable]="true" (removed)="removeCategory(c)">
          {{ c }}
          <mat-icon matChipRemove>cancel</mat-icon>
        </mat-chip>
      </mat-chip-list>
      <mat-form-field>
        <input matInput
               [matChipInputFor]="categoryList"
               [matChipInputSeparatorKeyCodes]="separatorKeysCodes"
               [matChipInputAddOnBlur]="false"
               (matChipInputTokenEnd)="addChip($event)">
      </mat-form-field>

    </div>
    <div class="form-buttons mt10">
      <button mat-raised-button color="primary" (click)="saveChanges()" class="mr5">Save</button>
      <button mat-raised-button color="accent" (click)="cancelChanges()" class="ml5">Cancel</button>
    </div>
  </form>
</div>

** edit.component.ts **

import { Component, Inject } from '@angular/core';
import { COMMA, ENTER } from '@angular/cdk/keycodes';
import { MAT_DIALOG_DATA, MatDialogRef, MatChipInputEvent } from '@angular/material';
import { TrainingData } from '../../../shared/models/training-data.model';
import { AdminService } from '../../../shared/services/admin.service';

@Component({
  selector: 'app-edit',
  templateUrl: './edit.component.html',
  styleUrls: ['./edit.component.scss']
})
export class EditComponent {
  readonly separatorKeysCodes: number[] = [ENTER, COMMA];
  constructor(public dialogRef: MatDialogRef<EditComponent>,
              @Inject(MAT_DIALOG_DATA) public dataModel: TrainingData,
              public adminService: AdminService ) {
  }

  addChip(event: MatChipInputEvent): void {
    const input = event.input;
    const value = event.value;

    if ((value || '').trim()) {
      this.dataModel.categories.push(value.trim());
    }

    if (input) {
      input.value = '';
    }
  }

  getDateInfo(): string {
    const dateObj = new Date(this.dataModel.year, this.dataModel.month, 1);
    const monthName = dateObj.toLocaleString('en-uk', { month: 'long' });
    return `${monthName} ${this.dataModel.year}`;
  }

  saveChanges() {
    this.adminService.saveTrainingData(this.dataModel)
      .subscribe(
        x => console.log(x),
        err => console.log(err),
        () => console.log('item updated')
      );
    this.dialogRef.close(this.dataModel);
  }

  cancelChanges(): void {
    this.dialogRef.close();
  }

  getAmountInfo(): string {
    const real = this.dataModel.reales ? this.dataModel.reales : 0;
    const maravedi = this.dataModel.maravedises ? this.dataModel.maravedises : 0;
    return `${real}r ${maravedi}m`;
  }

  removeCategory(category: string) {
    this.dataModel.categories.splice(this.dataModel.categories.indexOf(category, 0));
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...