使用ngModel创建组件
@angular/forms里有个接口用来实现支持[(ngModel)],具体可查ControlValueAccessor,这边还未深入理解只是为了开发组件而初步了解
interface ControlValueAccessor {
writeValue(obj: any): void
registerOnChange(fn: any): void
registerOnTouched(fn: any): void
}
我们要做的事就是实现这个接口
import {NG_VALUE_ACCESSOR,ControlValueAccessor} from "@angular/forms"
@Component({
selector: 'app-search-select',
templateUrl: './search-select.component.html',
styleUrls: ['./search-select.component.less'],
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SearchSelectComponent),
multi: true
}]
})
export class SearchSelectComponent implements ControlValueAccessor {
writeValue(obj: any): void
registerOnChange(fn: any): void
registerOnTouched(fn: any): void
registerOnChange(fn: any): void
registerOnTouched(fn: any): void
}
下面是我实现下拉框的子组件和父组件值的双向绑定,也很好的解释angular 的双向数据绑定是由属性绑定和方法绑定结合在一起的
export class SearchSelectComponent implements ControlValueAccessor { @Input() ngModel:string; @Output() ngModelChange=new EventEmitter<string>(); @Input() options:Array<any>; private selectValue:string; private isShow:boolean; private selectList:Array<any>; constructor() { this.isShow=false; } ngOnChanges(){ this.selectValue=this.ngModel; this.selectList=this.options; } registerOnChange(fn: any): void { // 页面值改变时,调用该方法,传入新值实现回传 } registerOnTouched(fn: any): void { } ngOnInit() { } // 赋值时调用 writeValue(val: object): void { } selectItem(value){ this.ngModelChange.emit(value); } showSelectList(){ this.isShow=true; } hideSelectList(){ this.isShow=false; } }

浙公网安备 33010602011771号