返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Angular组件库ng-zorro-antd实现radio单选框选择
  • 842
分享到

Angular组件库ng-zorro-antd实现radio单选框选择

Angular单选框取消选择Angular radio 2023-05-20 05:05:17 842人浏览 独家记忆
摘要

目录antd组件库升级之后代码不生效解决方法总结antd组件库升级之后代码不生效 项目业务之前的代码设计了类似radio单选框取消选择的相关逻辑,用的是下面类似的代码实现的。但近期对

antd组件库升级之后代码不生效

项目业务之前的代码设计了类似radio单选框取消选择的相关逻辑,用的是下面类似的代码实现的。但近期对ng-zorro-antd组件库升级之后,下面的代码不生效了。

import { Component } from '@angular/core';
@Component({
  selector: 'nz-demo-radio-radiogroup',
  template: `
    <nz-radio-group [(ngModel)]="radioValue">
      <label nz-radio (click)="click('A')" nzValue="A">A</label>
      <label nz-radio nzValue="B">B</label>
      <label nz-radio nzValue="C">C</label>
      <label nz-radio nzValue="D">D</label>
    </nz-radio-group>
  `
})
export class NzDemoRadioRadiogroupComponent {
  radioValue = 'A';
  click(value: any) {
    if (this.radioValue === value) {
      this.radioValue = ''
    }
  }
}

于是我到组件库源码里去找原因,并写demo打断点调试

  • 将nz-radio-group绑定的radioValue值清空会首先走group组件下面的逻辑
writeValue(value: NzSafeAny): void {
    this.value = value;
    this.nzRadiOService.select(value);
    this.cdr.markForCheck();
  }
  • nz-radio 和 nz-radio-group都是共用这个NzRadioService,且组件内init时都有对selected$这个流做监听
@Injectable()
export class NzRadioService {
  selected$ = new ReplaySubject<NzSafeAny>(1);
  touched$ = new Subject<void>();
  disabled$ = new ReplaySubject<boolean>(1);
  name$ = new ReplaySubject<string>(1);
  touch(): void {
    this.touched$.next();
  }
  select(value: NzSafeAny): void {
    this.selected$.next(value);
  }
  setDisabled(value: boolean): void {
    this.disabled$.next(value);
  }
  setName(value: string): void {
    this.name$.next(value);
  }
}
// radio.component.ts ====> nGonInit
this.nzRadioService.selected$.pipe(takeUntil(this.destroy$)).subscribe(value => {
        const isChecked = this.isChecked;
        this.isChecked = this.nzValue === value;
        // We don't have to run `onChange()` on each `nz-radio` button whenever the `selected$` emits.
        // If we have 8 `nz-radio` buttons within the `nz-radio-group` and they're all connected with
        // `ngModel` or `fORMControl` then `onChange()` will be called 8 times for each `nz-radio` button.
        // We prevent this by checking if `isChecked` has been changed or not.
        if (
          this.isNgModel &&
          isChecked !== this.isChecked &&
          // We're only intereted if `isChecked` has been changed to `false` value to emit `false` to the ascendant form,
          // since we already emit `true` within the `setupClickListener`.
          this.isChecked === false
        ) {
          this.onChange(false);
        }
        this.cdr.markForCheck();
      });
  • 当监听完值改变后,后面又执行了radio的click事件,把点击哪个radio的value值传过去了,所以之前的清空值操作就被覆盖了。
private setupClickListener(): void {
    this.ngZone.runOutsideangular(() => {
      fromEvent<MouseEvent>(this.elementRef.nativeElement, 'click')
        .pipe(takeUntil(this.destroy$))
        .subscribe(event => {
          
          event.stopPropagation();
          event.preventDefault();
          if (this.nzDisabled || this.isChecked) {
            return;
          }
          this.ngZone.run(() => {
            // !!! again  
            this.nzRadioService?.select(this.nzValue);
            if (this.isNgModel) {
              this.isChecked = true;
              this.onChange(true);
            }
            this.cdr.markForCheck();
          });
        });
    });
  }

解决方法

清空值的操作加setTimeout 使组件库内部先执行完click后续再执行。

import { Component } from '@angular/core';
@Component({
selector: 'nz-demo-radio-radiogroup',
template: `
  <nz-radio-group [(ngModel)]="radioValue">
    <label nz-radio (click)="click('A')" nzValue="A">A</label>
    <label nz-radio nzValue="B">B</label>
    <label nz-radio nzValue="C">C</label>
    <label nz-radio nzValue="D">D</label>
  </nz-radio-group>
`
})
export class NzDemoRadioRadiogroupComponent {
radioValue = 'A';
click(value: any) {
  if (this.radioValue === value) {
    setTimeout(()=>{
      this.radioValue = ''
    })
  }
}
}

总结

其实组件库单选radio本身是不支持取消选择的,正解应该是用checkbox实现相关的业务逻辑才对,但很久之前的业务逻辑涉及到很多地方的修改,此时再换checkbox并且换样式的话,改动的还是比较大的,就先简单解决这个问题。

--结束END--

本文标题: Angular组件库ng-zorro-antd实现radio单选框选择

本文链接: https://lsjlt.com/news/213958.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Angular组件库ng-zorro-antd实现radio单选框选择
    目录antd组件库升级之后代码不生效解决方法总结antd组件库升级之后代码不生效 项目业务之前的代码设计了类似radio单选框取消选择的相关逻辑,用的是下面类似的代码实现的。但近期对...
    99+
    2023-05-20
    Angular单选框取消选择 Angular radio
  • 如何实现超炫checkbox复选框和radio单选框
    这篇文章主要讲解了“如何实现超炫checkbox复选框和radio单选框”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现超炫checkbox复选框和r...
    99+
    2024-04-02
  • 怎么用css3实现checkbox复选框和radio单选框
    这篇文章主要介绍“怎么用css3实现checkbox复选框和radio单选框”,在日常操作中,相信很多人在怎么用css3实现checkbox复选框和radio单选框问题上存在疑惑,小编查阅了各式资料,整理出...
    99+
    2024-04-02
  • 纯css3怎么实现简单的checkbox复选框和radio单选框
    这篇文章主要介绍“纯css3怎么实现简单的checkbox复选框和radio单选框”,在日常操作中,相信很多人在纯css3怎么实现简单的checkbox复选框和radio单选框问题上存在疑惑,小编查阅了各式...
    99+
    2024-04-02
  • 微信小程序表单组件单选框radio怎么用
    这篇文章主要介绍了微信小程序表单组件单选框radio怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序表单组件单选框radio怎么用文章都会有所收获,下面我们一起来看看吧。微信小程序单选框radio...
    99+
    2023-06-26
  • angular框架如何实现全选与单选chekbox
    这篇文章将为大家详细讲解有关angular框架如何实现全选与单选chekbox,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1)页面内容(静态页)<ul ...
    99+
    2024-04-02
  • BootStrap表单控件之复选框checkbox和单选择按钮radio的示例分析
    小编给大家分享一下BootStrap表单控件之复选框checkbox和单选择按钮radio的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1.运行效果如图所示2.实现代码如下<...
    99+
    2024-04-02
  • angular如何实现一个列表的选择全选交互组件
    这篇文章给大家分享的是有关angular如何实现一个列表的选择全选交互组件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。需求分析实现单选;实现全选;可以设置允许多选还是单选。如果...
    99+
    2024-04-02
  • vue中radio单选框如何实现取消选中状态问题
    目录vue radio单选框如何取消选中状态客户需求如何获取radio的选中值 、选中状态方法1方法2总结vue radio单选框如何取消选中状态 客户需求 单选radio选中后,再...
    99+
    2023-05-20
    vue中radio单选框 radio单选框取消选中状态 radio单选框选中状态
  • Android组件实现列表选择框功能
    android提供的列表选择框(Spinner)相当于web端用户注册时的选择下拉框,比如注册候选择省份城市等。如下图便是一个列表选择框 下拉列表的列表选择项能够通过xml文...
    99+
    2022-06-06
    列表 选择 Android
  • 日期选择组件(DatePicker)的实现
    日期选择组件(DatePicker)的实现可以使用以下步骤:1. 创建一个输入框(input)用于显示选中的日期。2. 创建一个弹出...
    99+
    2023-09-15
    实现
  • Flutter怎么实现单选,复选和开关组件
    本文小编为大家详细介绍“Flutter怎么实现单选,复选和开关组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Flutter怎么实现单选,复选和开关组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、开关 ...
    99+
    2023-06-30
  • vue3.0实现复选框组件的封装
    本文实例为大家分享了vue3.0实现复选框组件封装的具体代码,供大家参考,具体内容如下 大致步骤: 实现组件本身的选中与不选中效果 实现组件的v-model指令 ...
    99+
    2024-04-02
  • JS实现一个文件选择组件详解
    目录前言插件安装插件使用参数说明前言 花了点时间利用广度与深度优先搜索算法实现了一个文件选择插件,支持无限层次的文件夹嵌套,已开源并打包上传到了npm。 本文将跟大家分享一下这个插件...
    99+
    2024-04-02
  • 如何利用Android组件实现一个列表选择框功能
    如何利用Android组件实现一个列表选择框功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。android提供的列表选择框(Spinner)相当于web端用户...
    99+
    2023-05-31
    android roi
  • 微信小程序如何实现picker组件下拉框选择input输入框
    这篇文章主要介绍微信小程序如何实现picker组件下拉框选择input输入框,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实现效果图:页面<view class=&q...
    99+
    2024-04-02
  • Flutter实现单选,复选和开关组件的示例代码
    目录1、开关 Switch2、单选 Radio3、复选多选 Checkbox小结1、开关 Switch 构造方法: const Switch({ Key key, requi...
    99+
    2024-04-02
  • vue如何用element实现区间选择组件
    这篇文章主要介绍“vue如何用element实现区间选择组件”,在日常操作中,相信很多人在vue如何用element实现区间选择组件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue如何用element实现...
    99+
    2023-07-04
  • vue怎么实现日期选择组件功能
    这篇文章主要讲解了“vue怎么实现日期选择组件功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue怎么实现日期选择组件功能”吧!目录结构demo 用vue-cli 的webpack-si...
    99+
    2023-07-04
  • vbs,hta中如何实现选择文件夹对话框
    小编给大家分享一下vbs,hta中如何实现选择文件夹对话框,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!代码如下:on error resume next Sel...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作