经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » AngularJS » 查看文章
利用Angular7开发一个Radio组件的全过程
来源:jb51  时间:2019/7/12 8:48:09  对本文有异议

一、准备工作

Angular7(以下简称ng7),已经跟之前版本大有不同。新建工程后,可方便创建library(简称lib),lib是什么呢?就是一个npm包的源码包。npm作为强大的包管理器,已经成为很多FEer分享智慧成果的法器。本文主要介绍本人写的一个radio组件。

二、开发组件radio过程

1、使用ng cli,新建工程,创建lib

  1. // 安装ng cli
  2. npm install -g @angular/cli
  3. // 新建工程
  4. ng new ng-project
  5. // 进入ng-project 创建一个lib
  6. ng generate library radio

2、生成结构如图所示 接下来开始写组件

3、radio结构如下

<!--说明:这其实是一个radio-group 因为radio一般都是分组使用,这里有几个注意点

1、组内radio的name属性保持一致、组外保持唯一

2、通过checked属性来设置radio的选中状态,一定不要写成[attr.checked]-->

  1. <div class="input-wrap" [class.hor]="horizontal">
  2. <div class="custom-radio" *ngFor="let item of data; let i=index">
  3. <input #input class="custom-input" [name]="name" id="{{'radio_'+name+i}}" type="radio"
  4. [value]="item.value" (click)="clickHandler(item.value)" [checked]="item.value === value"
  5. [disabled]="disabled">
  6. <label class="custom-label" for="{{'radio_'+name+i}}">{{item.name}}</label>
  7. </div>
  8. </div>

4、radio组件主体代码如下

  1. export class RadioGroupComponent implements ControlValueAccessor {
  2.  
  3. /* radio 数组 */
  4. @Input()
  5. data: Radio[] = [];
  6.  
  7. /* radio 类型 原生或者按钮类型*/
  8. @Input()
  9. type: string;
  10.  
  11. /* name标识 */
  12. @Input()
  13. name: string = this.idSer.generate().replace(/-/g, '_');
  14.  
  15. /* 水平排列 */
  16. @Input()
  17. horizontal: boolean;
  18.  
  19. /* 禁用 */
  20. @Input()
  21. disabled: boolean;
  22.  
  23. /* radio 值 */
  24. @Input() value: any;
  25.  
  26. constructor(private idSer: IdService) {
  27.  
  28. }
  29.  
  30. clickHandler(val: any) {
  31. this.value = val;
  32. // 更改control的值
  33. this.controlChange(this.value);
  34. this.controlTouch(this.value);
  35. }
  36.  
  37.  
  38. writeValue(value: any): void {
  39. this.value = value;
  40. }
  41.  
  42. registerOnChange(fn: Function): void {
  43. this.controlChange = fn
  44. }
  45.  
  46. registerOnTouched(fn: Function): void {
  47. this.controlTouch = fn
  48. }
  49.  
  50. private controlChange: Function = () => { }
  51. private controlTouch: Function = () => { }
  52.  
  53. }

说明:其实组件代码不是很多,但是应该注意到,我们继承了ng的一个interface ControlValueAccessor,这里我觉的是比较值得侃的地方。这是ng的一个forms API,可以方便原生DOM和ng forms传值。在组件元数据中这样定义

  1. @Component({
  2. selector: 'radiogroup',
  3. templateUrl: './radiogroup.component.html',
  4. providers: [{
  5. provide: NG_VALUE_ACCESSOR,
  6. useExisting: forwardRef(() => RadioGroupComponent),
  7. multi: true,
  8. }]
  9. })

其中,这里面有两个重要的方法需要overwrite,不错,就是registerOnChange和registerOnTouched,这两个方法在angular中是这样定义和使用的


他们分别是在formcontrol的updateOn(这个属性可以自定义)属性值为change或者blur的时候调用。因此,我们在重写这两个方法的时候应该注意,是重写一个还是都要重写。本组件两个方法都重写了,因为值变更的时机自定义成了blur。

三、这就是我的关于radio组件的封装开发,还请各位大牛朋友们多多指点,后续会继续推出关于Angular的开发以及研究。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对w3xue的支持。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号