我正在使用Angular Material中的mat-checkbox,我已经添加了change事件,如下所示…

<div *ngFor="let subscriber of selectedSubscribers">
    <mat-checkbox (change)="onSubscriberCheck(subscriber)">
        {{ subscriber.name }}
    </mat-checkbox>
</div>

代码onSubscriberCheck(subscriber)如下所示:

onSubscriberCheck(subscriber: Subscribers) {
    if (subscriber.checked) {
        //Do Something
    } else {
        //Do Something else
    }
}

在这里点击复选框,我总是得到subscriber.checked作为undefined的值.

我的预期结果是,如果选中它,则值应该是true而不是undefined.如果未选中,则该值应为false,而不是undefined.

EDIT

如果我添加[(ngModel)],则复选框列表不能正常工作.让我添加完整的场景...

我有两套复选框列表.其中一个是一组包含checked个复选框的列表,在另一个列表下面,我将显示一组包含unchecked个复选框的列表.因此,在onSubscriberCheck(subscriber)事件中,Do Something如下所示.

onSubscriberCheck(subscriber: Subscribers) {
    if (subscriber.checked) {
        this.selectedSubscribers.push(subscriber);
        this.unselectedSubscribers = this.unselectedSubscribers.filter(s => s.id !== subscriber.id);
    } else {
        this.unselectedSubscribers.push(subscriber);
        this.selectedSubscribers = this.selectedSubscribers.filter(s => s.id !== subscriber.id);
    }
}

所以,在这里,[(ngModel)] = subscriber.checkedchange事件都会触发.如何克服这一点?

我只想在列表顶部显示选中的复选框,在底部显示未选中的复选框.因此,在发生更改事件时,我正在重新排列数组selectedSubscribersunselectedSubscribers

SECOND EDIT

我正在使用以下函数来填充订阅者

GetSelectedSubscribers() {
    this.selectedSubscribers = this.allSubscribers
      .filter(subscriber => subscriber.id !== undefined) 
      .map(subscriber => ({ id: subscriber.id, name: subscriber.name, checked: subscriber.checked }));
}

GetUnselectedSubscribers(){
    this.unselectedSubscriberGroupItems = this.subtractListIds(this.allSubscriberGroupItems, this.selectedSubscriberGroupItems);
    this.unselectedSubscribers = this.unselectedSubscriberGroupItems.lists.map(subscriber => ({ id: subscriber.id, name: subscriber.name, checked: subscriber.checked }));
}

在这里,最后一个复选框名称为空,但具有复选框控件.不知道为什么它不显示..

请澄清...

推荐答案

Mat-复选框的方法change的参数是MatCheckboxChange,参见API.此外,您可以使用$EVENT获取此参数

你可以 Select 使用两个绑定[(ngModel)]或使用事件(change)和属性[checked].

正如Naren解释使用ngModel一样,我想展示另一种方法.其思想是使用唯一数组并对该数组进行排序.

<div *ngFor="let subscribe of subscribers;let index=index">
    <mat-checkbox [checked]="subscribe.checked" 
                  (change)="subscribe.checked=$event.checked;sort()">
        {{ subscribe.name }}
    </mat-checkbox>
</div>

哪里

  subscribers: any = [
    { checked: false, name: 'test'},
    { checked: false, name: 'test2'},
    ...
  ]

函数sort

  sort()
  {
    setTimeout(()=>{
      this.subscribers.sort((a:any,b:any)=>
            (a.checked && b.checked) ||(!a.checked && !b.checked)?
                           a.name>b.name?1:-1:
             a.checked?-1:
             1)
    })
  }

It's necessary the setTimeout, else the mat-checkbox mark the position 哪里 we are.

stackblitzstackblitz

Angular相关问答推荐

带逻辑的组件decorator 中的Angular 主机侦听器属性

如何在ANGLING v17中使用鞋带样式组件?

如何将管道异步化添加到不在html模板中的观察对象的Angular ?

如何在Primeng中实现自定义排序

使用BLOB数据类型时,HTTPCLIENT中可能存在错误

基于RxJS的Angular 服务数据缓存

JsPDF Autotable 将图像添加到列中出现错误:属性getElementsByTagName不存在

Angular 升级后 RXJS SwitchMap 无法与解析器一起正常工作

Angular 重新渲染仅使用ngrx在表中更改的行

全局异常处理

如何在 Angular 4 中使用 Material Design 图标?

错误:formControlName 必须与父 formGroup 指令一起使用.您需要添加一个 formGroup 指令

检测指令中输入值何时更改

将 Angular 5 升级到 6 时,我得到不兼容的对等依赖(使用 ng update @angular/core)

Angular 2 setinterval() 继续在其他组件上运行

Angular 2:formGroup 需要一个 FormGroup 实例

MatToolbar 与 Angular 9 一起使用时抛出错误

Angular 2 router.navigate

Angular2中是否有像window.onbeforeunload这样的生命周期钩子?

动态添加/删除验证器