Событие изменения угловой формы с компонентами материала - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть форма, содержащая входные данные и материальные компоненты (например, mat-select или mat-checkbox).

Каждый раз, когда изменение выполняетсяПользователь, я хочу сохранить их в БД.Поэтому я сделал что-то вроде <form (change)="save()">.

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

Я бы лучше избегалтакие решения, как использование <mat-select (selectionChange)="save()"> для каждого компонента, так как я легко могу забыть добавить его, когда мне придется обновить свою форму.

Изменить

Этоуправляемая шаблоном форма.Мой шаблон выглядит следующим образом:

<form (change)="save()">
    <!-- Will trigger save -->
    <mat-form-field class="col">
        <input matInput placeholder="Name" name="name" [(ngModel)]="item.name">
    </mat-form-field>

    <!-- Will NOT trigger save -->
    <mat-form-field class="col">
        <mat-select placeholder="Category" name="category [(ngModel)]="item.category.id">
            <mat-option *ngFor="let category of categories" [value]="category.id">{{category.name}}</mat-option>
        </mat-select>
    </mat-form-field>

    <!-- ... -->
</form>

Код компонента не имеет ничего конкретного, только переменная модели (item: Item;).

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

С помощью change tracker вы можете решить эту проблему.

Проверьте следующий пример:

import { Component , KeyValueChanges, KeyValueDiffer, KeyValueDiffers, DoCheck, OnInit } from '@angular/core';

@Component({
  selector: 'input-overview-example',
  styleUrls: ['input-overview-example.css'],
  templateUrl: 'input-overview-example.html',
})
export class InputOverviewExample implements OnInit, DoCheck {
  categories = [
    { id: 'id-1', name: 'Category 1' },
    { id: 'id-2', name: 'Category 2' },
    { id: 'id-3', name: 'Category 3' },
  ] as ExampleCategory[];
  item = new ExampleItem('Item One', this.categories[0].id);
  itemDiffer: KeyValueDiffer<string, any>;

  constructor(private readonly differs: KeyValueDiffers) { }

  ngOnInit() {
    this.itemDiffer = this.differs.find(this.item).create();
  }

  ngDoCheck(): void {
    const changes = this.itemDiffer.diff(this.item);
    if (changes) {
      //TODO: Save data here
      console.log("changed to: " + JSON.stringify(this.item));
    }
  }
}

export class ExampleItem {
  constructor(
    public name: string,
    public categoryId: string) {
  }
}

export class ExampleCategory {
  constructor(
    public id: string,
    public name: string) {
  }
}

И компонент HTML:

<form>
    <mat-form-field class="col">
        <input matInput placeholder="Name" name="name" [(ngModel)]="item.name">
    </mat-form-field>

    <mat-form-field class="col">
        <mat-select placeholder="Category" name="category" [(ngModel)]="item.categoryId" required>
            <mat-option *ngFor="let category of categories" [value]="category.id">{{category.name}}</mat-option>
        </mat-select>
    </mat-form-field>
</form>

Надеюсь, это поможет!

0 голосов
/ 20 ноября 2018

вы все еще можете обернуть <form (change)="save()" [formGroup]="form"> вокруг него

, а затем использовать <mat-form-field> вокруг других компонентов вашего мата.он должен слушать на форме группы.Компоненты могут получить идентификатор с помощью formControlName = ""

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