我正在尝试创建一个使用Switchery设计的自定义复选框组件,可以像任何其他形式一样使用< input type =“checkBox”... />零件.
我现在的代码负责样式:
import {Component,ViewChild,AfterViewInit,Input} from 'angular2/core'; import switchery from 'switchery'; @Component({ selector: 'switchery-checkBox',template: `<input #checkBox type="checkBox" class="js-switch"/>`,}) export class SwitcheryComponent implements AfterViewInit { @Input() options: Switchery.Options = {}; @ViewChild('checkBox') checkBox: any; ngAfterViewInit() { new switchery(this.checkBox.nativeElement,this.options); } }
我需要添加什么才能在模板中使用它,如下面的代码?理想情况下,它应该实现< input type =“checkBox”/>的所有功能.
<switchery-checkBox [(ngModel)]="model.onOrOff" ngControl="onOrOff" [disabled]="disabledCondition" ... > </switchery-checkBox>
实际上,您需要使组件“符合ngModel”,但需要实现自定义值访问器.
原文链接:https://www.f2er.com/angularjs/143308.html这是方法:
@Component({ selector: 'switchery-checkBox',template: ` <input #checkBox type="checkBox" (change)="onChange($event.target.checked)" class="js-switch"/> `,(...) }) export class SwitcheryComponent implements AfterViewInit,ControlValueAccessor { @Input() options: Switchery.Options = {}; @Input() disabled:boolean = false; @ViewChild('checkBox') checkBox: any; value: boolean = false; onChange = (_) => {}; onTouched = () => {}; writeValue(value: any): void { this.value = value; this.setValue(this.value); } registerOnChange(fn: (_: any) => void): void { this.onChange = fn; } registerOnTouched(fn: () => void): void { this.onTouched = fn; } ngAfterViewInit() { this.switcher = new switchery(this.checkBox.nativeElement,this.options); this.setValue(this.value); this.setDisabled(this.disabled); } ngOnChanges(changes: {[propName: string]: SimpleChange}) { if (changes && changes.disabled) { this.setDisabled(changes.disabled.currentValue); } } setValue(value) { if (this.switcher) { var element = this.switcher.element; element.checked = value } } setDisabled(value) { if (this.switcher) { if (value) { this.switcher.disable(); } else { this.switcher.enable(); } } } }
最后,您需要将值访问器注册到组件的提供者:
const CUSTOM_VALUE_ACCESSOR = new Provider( NG_VALUE_ACCESSOR,{useExisting: forwardRef(() => SwitcheryComponent),multi: true}); @Component({ selector: 'switchery-checkBox',providers: [ CUSTOM_VALUE_ACCESSOR ] }) export class SwitcheryComponent implements AfterViewInit,ControlValueAccessor { (...) }
这样你就可以这样使用你的指令:
<switchery-checkBox [disabled]="disabled" [(ngModel)]="value" ngControl="cb" #cb="ngForm"></switchery-checkBox>
看到这个plunkr:https://plnkr.co/edit/z1gAC5U0pgMSq0wicGHC?p=preview.
有关更多详细信息,请参阅此文章(“与NgModel兼容的组件”部分):
> http://restlet.com/blog/2016/02/17/implementing-angular2-forms-beyond-basics-part-2/