angular - mat-checkbox marcar solo si la condición es verdadera
Tengo una lista de tabla de usuarios con mat-checkbox. Cuando se haga clic en mat-checkbox, la casilla solo debe marcarse si se cumple cierta condición.
Aquí en este código, estoy intentando que la casilla de verificación esté marcada solo para id=2. Pero como puedes ver, inicialmente cuando se hace clic en la casilla de verificación de 2, no se marca aunque 2 esté agregado al array de elementos que deberían estar marcados.
Por otro lado, cuando se hace clic en la casilla de verificación de 1,3 o 4, se marcan.
componente.html
<tbody>
<tr *ngFor="let user of users; let in = index">
<td>
<mat-checkbox [ngModel]="canbeChecked(user.id)" (click)="userSelectClick(user.id)"></mat-checkbox>
</td>
</tr>
</tbody>
componente.ts
export class AppComponent {
users = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }];
checked: boolean = true
constructor() { }
selected: any = [];
canbeChecked(id): boolean {
console.log("check " + id)
console.log(this.selected)
return this.selected.includes(id);
}
userSelectClick(id) {
if (!this.selected.includes(id)) {
if (id == 2)
this.selected.push(id);
console.log("select " + id)
console.log(this.selected)
}
else {
this.selected = this.selected.filter(item => item !== id)
}
}
}
Código funcional: https://stackblitz.com/edit/mat-checkbox-conditional
Respuesta #1
He utilizado la vinculación de eventos en ngModel en el html y también modificado algo de código en app.component.ts. Ahora solo se puede marcar la casilla con id 2. Por favor, vea el código a continuación
en app.component.html
<mat-checkbox (ngModel)="canbeChecked(user.id)" (click)="userSelectClick(user.id)"></mat-checkbox>
y en app.component.ts
export class AppComponent {
users = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }];
checked: boolean = true
constructor() { }
selected: any = [];
canbeChecked(id): boolean {
console.log(this.selected.includes(id));
return this.selected.includes(id);
}
userSelectClick(id) {
if (!this.selected.includes(id)) {
if (id == 2){
this.selected.push(id);
}
else{
return false;
}
}
else {
if(id == 2){
this.selected = [];
}
else
return false;
}
}
}
Aquí hay un enlace que funciona
https://stackblitz.com/edit/mat-checkbox-conditional-z8uc94
Respuesta #2
Soy novato en Stack Overflow. Puedes intentar cambiar el evento para esas cosas.
componente.ts
import { Component } from '@angular/core';
@Component({
selector: 'material-app',
templateUrl: 'app.component.html',
styleUrls: ['app.component.css']
})
export class AppComponent {
user_checked = false;
users = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }];
checked: boolean = false;
constructor() { }
selected: any = [];
canbeChecked(id): boolean {
console.log("check " + id)
console.log(this.selected)
return this.selected.includes(id);
}
userSelectClick(event,id) {
if (!this.selected.includes(id)) {
if (id == 2)
this.selected.push(id);
console.log("selecrted iDs " + id)
console.log(this.selected)
}
else {
this.selected = this.selected.filter(item => item !== id)
}
}
}
/**
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
componente.html
