angular 如何实现ng-model

最近在用angular5写项目,刚接触angular,他对于我还是陌生的朋友,最近写了一个组件 用到了ng-model的实现,所以这里简单记录下

比如要创建一个组件叫my-input

1首先 

在@Component配置中添加encapsulation的配置,它有三个值分别是

ViewEncapsulation.None:没有Shadow Dom,样式没有封装,全局可以使用。

ViewEncapsulation.Emulated:angular2的默认值,模仿ShadowDom,通过在标签上增加标识,来固定样式的作用域

ViewEncapsulation.Native:使用原生的Shadow Dom

一般使用默认值ViewEncapsulation.Emulated

2 配置providers

providers:[{

    provide:NG_VALUE_ACCESSOR,

    useExisting:forwardRef(()=>{MyInputComponent}) ,//这里是组件的名字

    multi:true

}]

//@Component完整代码
@Component({
   selector:'app-my-input',
   templateUrl:'./my-input.component.html',
   styleUrls:['./my-input.component.scss'],
   encapsulation:ViewEncapsulation.Emulated,
   providers:[{
     provide:NG_VALUE_ACCESSOR,
     useExisting:forwardRef(()=>MyInputComponent),
     multi:true
   }]
})

 3 MyINputComponent要实现ControValueAccessor这个接口

它有3个方法  writeValue(obj:any):void和registerOnChange(fn:any):void    registerOnTouched(fn:any):void要实现

实现了这三个方法基本就可以实现数据的输出

数据的输入是通过@Input data获取的

export class MyInputComponent implements OnInit,ControlValue{
  @Input() data:string;

  onChange: any=Function.prototype;
  onTouched: any=Function.prototype;
 

  constructor(){}

  writeValue(obj:any):void{
     this.data = obj;
  }

  registerOnChange(fn:any):void{
     this.onChange=fn
  }

  registerOnTouched(fn:any):void{
     this.onTouch=fn
  }
//自定义方法   当数据改变的时候
  dataChange(){
     this.onChange(this.data)
  }

}

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值