Удалить выбранные элементы из углового Material mat-selection-list

#angular #typescript #angular-material

#angular #typescript #angular-материал

Вопрос:

Мне нужно иметь возможность удалять выбранные элементы из списка материалов Angular. Для этого я решил вычесть массив выбранных элементов из исходного массива элементов (не уверен, что это лучший способ сделать это).

Моя проблема в том, что я не могу найти способ передать массив выбранных элементов из HTML в TS и поиграть с ним.

В документации Angular Material приведен следующий пример:

 {{x.selectedOptions.selected.y}}
 

где x — идентификатор селектора mat-selection-list, а y — это то, что вы делаете с выбранными элементами. Но, похоже, это работает только в HTML.

Ниже приведен мой код, который не работает.

HTML, где я настраиваю список и кнопку, которая должна запускать функцию удаления.

 <mat-selection-list #apps>
    <mat-list-option *ngFor="let app of appList" [value]="app">
      {{app}}
    </mat-list-option>
</mat-selection-list>

<button 
class='remove-button' 
(click)="deleteSelected()"
mat-stroked-button color="primary">
    Remove from list
</button>
 

TS, где я пытаюсь возиться с выбранными параметрами, но это, очевидно, не работает, потому что selectedOptions объявлен как массив строк и не имеет метода «selected». Я понимаю, что это была глупая попытка, но в любом случае, не могу найти лучшего способа 🙂 Должен быть способ передать выбранные элементы в виде массива в TS…

 export class SubscriptionListComponent implements OnInit {

  selectedOptions: string[]
  appList: string[] = ['Instagram', 'Facebook', 'Telegram', 'WhatsApp', 'GitHub']

  deleteSelected() {
    this.appList.filter(x => !this.selectedOptions.selected.includes(x))
  }
 

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

Комментарии:

1. selectedOptions является свойством MatSelectionList . Посмотрите, можете ли вы ссылаться на него с помощью @ViewChild(MatSelectionList) selectionList: MatSelectionList;

2. @robbieAreBest спасибо, очень признателен, все отлично сработало!

Ответ №1:

Для тех, кто может столкнуться с такой же проблемой, я публикую код, который сработал для меня и сделал именно то, что я хотел (удалить выбранные элементы из списка по щелчку мыши).

HTML остался таким же, как указано выше.

ТС:

 import { Component, OnInit, ViewChild } from '@angular/core';
import { MatSelectionList } from '@angular/material/list';


@Component({
  selector: 'app-subscription-list',
  templateUrl: './subscription-list.component.html',
  styleUrls: ['./subscription-list.component.scss']
})
export class SubscriptionListComponent implements OnInit {

  @ViewChild('apps') selectionList: MatSelectionList

  appList: string[] = ['Instagram', 'Facebook', 'Telegram', 'WhatsApp', 'GitHub']

  deleteSelected() {
    var selected: string[] = this.selectionList.selectedOptions.selected.map(s => s.value)
    var diff = this.appList.filter(el => !selected.includes(el))
    this.appList = diff
  }

  constructor() { }

  ngOnInit(): void {
  }

}