我知道我可以使用复选框实现此行为,但我需要仅选择一个项目。任何帮助? 我的代码看起来像:
<mat-radio-button>
**更新**10/11/2022
参考Sara的Stackblitz答案下面。您可以做以下事情来实现这一目标。
<mat-radio-group name="WasFamilyMemberPresent">
<mat-radio-button *ngFor="let item of lookupNoYes" [value]="item.Code" >
{{item.Desc}}
</mat-radio-button>
</mat-radio-group>
并将其传递到组件方法
#button
(click)="checkState(button)"
创建组件中的局部变量以存储按钮值以进行比较。
<mat-radio-button #button class="example-radio-button" *ngFor="let season of seasons" [value]="season" (click)="checkState(button)">
checkState()
将其置于消化循环中,检查局部变量是否存在,以及当前值是否等于参数值...如果是真正的取消选择,请删除焦点和null local变量... else设置本地变量以将来比较.
currentCheckedValue = null;
我在这里简化了元帅的代码
https://stackblitz.com/edit/angular-c37tsw-zho1oe
i删除了 constructor(private ren: Renderer2) { }
setTimeout
进口,即使没有这些,它似乎也起作用了。
checkState(el) {
setTimeout(() => {
if (this.currentCheckedValue && this.currentCheckedValue === el.value) {
el.checked = false;
this.ren.removeClass(el['_elementRef'].nativeElement, 'cdk-focused');
this.ren.removeClass(el['_elementRef'].nativeElement, 'cdk-program-focused');
this.currentCheckedValue = null;
this.favoriteSeason = null;
} else {
this.currentCheckedValue = el.value
}
})
}
。我认为以上2个答案不再工作的原因是在您在TS文件中收到按钮之前设置该按钮的值,因此无论您如何尝试将
setTimeout
值分配给Renderer2
去上班。但是改变该课程是可行的。此方法还允许您取消选择按钮,而无需跟踪任何类型的全局变量。这是一个通用示例:
在html中,每个按钮都使用the the the the Reference变量和单击事件传递事件和按钮参考。
event.preventDefault()
然后在
'mat-radio-checked'
函数检查中检查以确保用户单击的按钮具有类
_checked
;如果确实可以删除支票类并添加我们自己的标志#
<mat-radio-group class="radio-group">
<mat-radio-button #option1 class="radio-item" value="New User" (click)="onRadioClick($event, option1)”>New User</mat-radio-button>
<mat-radio-button #option2 class="radio-item" value=“Existing User" (click)="onRadioClick($event, option2)”>Existing User</mat-radio-button>
</mat-radio-group>
onRadioClick
CSS课程,并且应该变得显而易见。
上面的所有答案都是用于模板驱动的形式,这些形式是被拟合的,没有打字并且没有单位测试,所以这是我对此的看法。
在我的模板中,我有3个广播按钮(不介意'mat-radio-checked'
翻译或CSS类):
marked-unchecked
在我的脚本中我有:
'mat-radio-checked'
我们无需防止默认事件,因为我们正在触发反应性形式控制的激活。 我的单位测试(带有业力/茉莉花)也是如此:
onRadioClick(event: any, button: any): void {
let targetButton = event.target;
while (targetButton && targetButton.parentNode && targetButton.parentNode.classList) {
targetButton = targetButton.parentNode;
if (targetButton.classList.contains('mat-radio-checked') && !targetButton.classList.contains('marked-unchecked')) {
targetButton.classList.remove('mat-radio-checked');
targetButton.classList.add('marked-unchecked');
break;
}
if (targetButton.classList.contains('marked-unchecked')) {
targetButton.classList.remove('marked-unchecked');
targetButton.classList.add('mat-radio-checked');
}
}
}
我希望这对某人有帮助。它已经完成并使用角/角材料17.我不确定您要寻找什么答案,因为Angular材料无线电按钮默认行为是仅允许选择项目。 (这就是我认为您是根据问题问的)
您试图创建用户可以取消选择
all
无线电按钮的行为吗?