国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Angular組件庫ng-zorro-antd實現radio單選框選擇

瀏覽:236日期:2022-06-10 08:53:48
目錄
  • antd組件庫升級之后代碼不生效
  • 解決方法
  • 總結

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 => {
  /** prevent label click triggered twice. **/
  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并且換樣式的話,改動的還是比較大的,就先簡單解決這個問題。

標簽: JavaScript
主站蜘蛛池模板: 国产片在线天堂av | 国产呦精品一区二区三区网站 | 97精品国产综合久久久久久欧美 | 成人性版蝴蝶影院污 | 欧美综合亚洲 | 国产乱淫a∨片免费视频 | 美女被免费网站视频软件 | 国产91精品露脸国语对白 | 久久综久久美利坚合众国 | 国产精品一区高清在线观看 | 国产成人综合网在线播放 | 九草在线观看 | 精品中文字幕不卡在线视频 | 97在线免费观看视频 | 国产日韩精品一区在线观看播放 | 中文国产成人精品久久水 | 越南高清幻女bbwxxxx | 天干夜天天夜天干天ww | 欧美三级美国一级 | 乱人伦中文视频在线 | 怡红院免费全部视频在线 | 国产成人免费高清视频 | 亚洲国产精选 | 成人 欧美 | 午夜日韩 | 手机看片福利视频 | 免费看成人www的网站软件 | 国产三级精品久久三级国专区 | 亚洲一级毛片中文字幕 | 欧美成人tv在线观看免费 | 亚洲精品久久久中文字 | 欧美一区精品 | 欧美第一网站 | 欧美视频www | 亚洲欧美日本人成在线观看 | 热re66久久精品国产99热 | 色站综合| 国产精品亚洲欧美日韩一区在线 | 在线永久免费观看黄网站 | 成人免费手机在线看网站 | 黄色三级网站在线观看 |