我正在使用Angular material 2创建一个带有 Select 列表(每个列表项都有复选框)的工具栏.我只是想不出如何在列表显示之前设置复选框,然后在用户交互后获取所选项目.

我正在try 表单中的控件,认为我可能需要它来绑定到ngModel,但这似乎没有帮助.到目前为止,我的html是:

<form
  novalidate
  #areaSelectForm="ngForm">

<div>
    <mat-selection-list 
                        #areasList="ngModel"
                        [(ngModel)]="model"
                        id="areaListControl"
                        name="areaListControl"
                        (ngModelChange)="onAreaListControlChanged($event)">
        <mat-list-option *ngFor="let tta of taskTypeAreas" (click)="onCheckboxClick($event)" [value]="tta">
            {{tta}}
        </mat-list-option>
    </mat-selection-list>
</div>

</form>

这条路一定走得很好,但文档很难解释,我似乎找不到任何合适的例子.

欢迎任何指导.

推荐答案

从版本5.0.0开始,Angular material 现在支持ngModel作为 Select 列表.

所以代码可以简化为

<mat-selection-list #list [(ngModel)]="selectedOptions" (ngModelChange)="onNgModelChange($event)">
    <mat-list-option *ngFor="let tta of taskTypeAreas" [value]="tta.name">
        {{tta.name}}
    </mat-list-option>
</mat-selection-list>

该版本还为 Select 列表公开了ngModelChange事件.这是更新后的stack blitz


(Original answer before Angular 5.0.0)

mat-select-list目前似乎不支持ngModel(https://github.com/angular/material2/pull/7456),但看起来在不久的将来会支持它.同时,您可以使用引用变量#list来获取所选选项.

// component.html
<mat-selection-list #list>
    <mat-list-option *ngFor="let tta of taskTypeAreas" [selected]="tta.selected" 
        (click)="onAreaListControlChanged(list)" [value]="tta.name">
        {{tta.name}}
    </mat-list-option>
</mat-selection-list>

然后将引用变量传递给onAreaListControlChanged(list)方法,这样就可以解析出所选的选项.

// component.ts
onAreaListControlChanged(list){
    this.selectedOptions = list.selectedOptions.selected.map(item => item.value);
}

要 Select 加载时的复选框,可以使用每个<mat-list-option>[selected]属性.

<mat-list-option ... [selected]="tta.selected" ...>

为此,您需要向数组中添加另一个属性.

// component.ts
taskTypeAreas: {
    name: string;
    selected: boolean;
}[] = [
    {
        name: 'Area 1',
        selected: false
    },
    {
        name: 'Area 2',
        selected: false
    },
    {
        name: 'Area 3',
        selected: true
    },
];

这将使Area 3在加载时被选中.这是一台stackblitz的样机.


Angular相关问答推荐

Angular:浏览器中未显示一些Google Content图标

RFDC.CommonJS或AMD依赖项可能会导致优化救助ANGURAL PROCEMENT with ngx-charts lib

Angular 信号不更新afterNextender()

如何跨不同组件使用ng模板

从Angular 14更新到15个多边形.ts问题

使用当前选定的选项创建IF语句

在Cypress中,对xlsx文件的读取并不总是正确的

Angular 显示来自文字数组的SVG路径

当包含react 性模板绑定时,NG-Bootstrap手风琴不会打开

Cypress 12.8.1 无法使用条纹元素 iframe

在 Angular material 表单元格中渲染 html

as和let之间的异步管道区别

从 angular 11 升级到 angular 12 后,我的项目没有使用优化参数进行编译

Angular 2如何使用路由和location.go()检测后退按钮按下?

错误 TS1086:无法在 Angular 9 的环境上下文中声明访问器

无法绑定到matMenuTriggerFor,因为它不是 button的已知属性

如何在 Angular CLI 1.1.1 版中将路由模块添加到现有模块?

Angular 5 手动导入语言环境

如何将组件导入Angular 2中的另一个根组件

Angular 2 更改事件 - 模型更改