web-dev-qa-db-ja.com

angular material 2でマットチップとオートコンプリートを使用して選択したオブジェクトを保存する方法

Angular 6 with Angular Materialを使用しています。選択したオブジェクトまたは選択したオブジェクトのリストをマットチップとオートコンプリートから保存しようとしています。文字列値をFruits []配列に送信できますが、選択したオブジェクトをFruits []配列に送信できません。解決策を見つけるのを手伝ってください。ありがとう。

私のデモプロジェクトリンク: stackblitzのデモコード

6
monir tuhin

この解決策を試すことができます。

Stackblitz でデモを作成しました。

component.html

<mat-form-field class="example-chip-list">
    <mat-chip-list #chipList>
        <mat-chip *ngFor="let fruit of fruits;let indx=index;" [selectable]="selectable" [removable]="removable" (removed)="remove(fruit,indx)">
            {{fruit.name}}
            <mat-icon matChipRemove *ngIf="removable">cancel</mat-icon>
        </mat-chip>
        <input placeholder="New fruit..." #fruitInput [formControl]="fruitCtrl" [matAutocomplete]="auto" [matChipInputFor]="chipList"
         [matChipInputSeparatorKeyCodes]="separatorKeysCodes" [matChipInputAddOnBlur]="addOnBlur" (matChipInputTokenEnd)="add($event)">
    </mat-chip-list>
    <mat-autocomplete #auto="matAutocomplete" (optionSelected)="selected($event)">
        <mat-option *ngFor="let fruit of filteredFruits | async" [value]="fruit">
            {{fruit.name}}
        </mat-option>
    </mat-autocomplete>
</mat-form-field>


<pre>{{fruits|json}}</pre>

component.ts

import { COMMA, ENTER } from '@angular/cdk/keycodes';
import { Component, ElementRef, ViewChild } from '@angular/core';
import { FormControl } from '@angular/forms';
import { MatAutocompleteSelectedEvent, MatChipInputEvent } from '@angular/material';
import { Observable } from 'rxjs';
import { map, startWith } from 'rxjs/operators';

/**
 * @title Basic chips
 */
@Component({
  selector: 'chips-overview-example',
  templateUrl: 'chips-overview-example.html',
  styleUrls: ['chips-overview-example.css'],
})
export class ChipsOverviewExample {
  visible = true;
  selectable = true;
  removable = true;
  addOnBlur = false;
  separatorKeysCodes: number[] = [ENTER, COMMA];
  fruitCtrl = new FormControl();
  filteredFruits: Observable<string[]>;
  fruits: any = [];
  allFruits: any = [
    {
      id: 1,
      name: 'Apple'
    },
    {
      id: 2,
      name: 'Orange'
    },
    {
      id: 3,
      name: 'Banana'
    },
    {
      id: 4,
      name: 'Malta'
    }
  ];

  @ViewChild('fruitInput') fruitInput: ElementRef;

  constructor() {
    this.filteredFruits = this.fruitCtrl.valueChanges.pipe(
      startWith(null),
      map((fruit: string | null) => fruit ? this._filter(fruit) : this.allFruits.slice()));
  }

  add(event: MatChipInputEvent): void {
    const input = event.input;
    const value = event.value;
    // Add our fruit
    if ((value || '').trim()) {
      this.fruits.Push({
          id:Math.random(),
          name:value.trim()
      });
    }

    // Reset the input value
    if (input) {
      input.value = '';
    }

    this.fruitCtrl.setValue(null);
  }

  remove(fruit, indx): void {
    this.fruits.splice(indx, 1);
  }

  selected(event: MatAutocompleteSelectedEvent): void {
    this.fruits.Push(event.option.value);
    this.fruitInput.nativeElement.value = '';
    this.fruitCtrl.setValue(null);
  }

  private _filter(value: any): string[] {
    return this.allFruits.filter(fruit => fruit.id === value.id);
  }
}
8
Krishna Rathore

私は、オートコンプリートを使用してリストからオブジェクトを選択するアプリケーションを開発しています。 Krishna Rathoreへの同様のアプローチを使用して、FormControlのvalueChangesイベントが文字列を確実に返すわけではないことを発見しました(代わりにオブジェクトを取得することもありました)。私の解決策は、Observable <String []>を追加し、それをマットオートコンプリートに使用することでした。また、autoFreeTextAddEngineerというプロパティを追加して、アプリがオートコンプリートリストのエントリ以外のエントリを許可する場合を処理します。 Demo Here があります。

1
Mick Buckley