【问题标题】:How to access selection options in material mat-selection-list如何访问材料垫选择列表中的选择选项
【发布时间】:2019-01-16 20:13:00
【问题描述】:

我正在尝试访问材质 mat-selection-list 组件(版本 7)的选定选项。我找到了 selectedOptions here 的文档。

我整理了一些似乎可以让我访问所需数据的 html/ts 行。但是,我认为这不是正确的方法。但是我找不到使用“著名搜索引擎”的建议。

我有以下 HTML (pizza.component.html)

<h1>Pizzas</h1>
<mat-selection-list #pizzaList (selectionChange)="onPizzasChange($event)">
    <mat-list-option *ngFor="let pizza of pizzas">
        {{pizza}}
    </mat-list-option>
</mat-selection-list>

以及对应的打字稿文件(pizza.component.ts)

import { MatButtonModule } from '@angular/material/button';
import { Component, OnInit } from '@angular/core';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { Pizza } from '../pizza';

@Component({
    selector: 'app-pizza-view',
    templateUrl: './pizza-view.component.html',
    styleUrls: ['./pizza-view.component.css']
})

export class PizzaViewComponent implements OnInit {

    pizzas: any;

    constructor( ) { }

    ngOnInit() {
        pizzas = [ 'Margherita', 'Funghi', 'Quattro Stagioni', 'Calzone' ];
    }

    onPizzasChange(event) {
        console.log("selectedOptions:", event.option.selectionList.selectedOptions._selection;
    };

}

问题是:我该如何正确地做到这一点?

PS:我正在使用@angular/core 7.0.0 和材料 7.0.1

【问题讨论】:

    标签: angular angular-material


    【解决方案1】:

    首先将value 用于字符串或ngValue 用于您的选项。

    <mat-list-option *ngFor="let pizza of pizzas" [value]="pizza"> or [ngValue]="pizza"
    

    选项 1:使用selectionChange

    将所选 MatListOptions 的数组传递给您的函数。

    <mat-selection-list #pizzaList (selectionChange)="onGroupsChange(pizzaList.selectedOptions.selected)">
        <mat-list-option *ngFor="let pizza of pizzas" [value]="pizza">
            {{pizza}}
        </mat-list-option>
    </mat-selection-list>
    

    您将获得一个数组,其中包含按选择顺序排列的选定选项。

    import { MatListOption } from '@angular/material/list'
    
    onGroupsChange(options: MatListOption[]) {
      // map these MatListOptions to their values
      console.log(options.map(o => o.value));
    }
    

    选项 2:使用ngModel

    正如@Eliseo 评论的那样,如果您只想访问所选数据但不需要收到更改通知,则可以使用ngModel 进行双向数据绑定。

    <mat-selection-list #pizzaList [(ngModel)]="selectedPizzas">
        <mat-list-option *ngFor="let pizza of pizzas" [value]="pizza">
            {{pizza}}
        </mat-list-option>
    </mat-selection-list>
    
    selectedPizzas: string[]; // this array will contain the selected pizzas
    

    要另外获得有关更改的通知,您可以添加ngModelChange

    <mat-selection-list #pizzaList [(ngModel)]="selectedPizzas" (ngModelChange)="onGroupsChange($event)">
    

    您将获得一个数组,其中包含所选选项的值,这些值按照它们在输入数组 pizzas 中出现的顺序排列(而不是按照它们在 selectionChange 中的选择顺序)。

    onGroupsChange(selectedPizzas: string[]) {
      console.log(selectedPizzas);
    }
    

    【讨论】:

    • 为什么使用(selectionChange)?您可以使用 [(ngModel)] - 或使用响应式 Form- 执行相同操作,请参阅 stackblitz.com/edit/angular-qcxfbe?file=app/…
    • @Eliseo 如果您只想访问值数组 [(ngModel)] 更简单,那么您是对的。我认为 OP 希望在模型更改时调用一个函数。您可以另外使用ngModelChange,但这对selectionChange 没有太大影响。反应式表单有点复杂,因为问题没有说明 OP 是否需要反应式表单附带的额外功能,所以我没有建议它们。
    • 选项 2 最有意义,并提供了我正在寻找的确切结果。谢谢。
    【解决方案2】:

    好吧,恕我直言,正确的方法似乎是使用MatSelectionListselectedOptions 属性。

    selectedOptions: SelectionModel<MatListOption>
    

    在您的示例中,您访问的是私有属性。
    您可以查看SelectionModel 的来源,看看您可以使用什么。

    正确的方法似乎是

    /** Selected values. */
    get selected(): T[] {
      if (!this._selected) {
        this._selected = Array.from(this._selection.values());
      }
    
      return this._selected;
    }
    

    事件类型为MatSelectionListChange,所以:

    onPizzasChange(event: MatSelectionListChange) {
        console.log("selectedOptions:", event.source.selectedOptions.selected();
    };
    

    PS:与其他答案不同,我更喜欢保持模板尽可能干净。

    所有的属性访问都可能在组件内部完成。这也更容易阅读和理解。

    【讨论】:

      猜你喜欢
      • 2021-02-17
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多