首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Switchery样式的自定义复选框输入组件

使用Switchery样式的自定义复选框输入组件
EN

Stack Overflow用户
提问于 2016-04-12 08:51:00
回答 1查看 3.9K关注 0票数 2

我正在尝试创建一个自定义复选框组件,它与任何其他<input type="checkbox" ... />组件一样,可以在表单中使用。

我现在拥有的代码负责样式设计:

代码语言:javascript
复制
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" />的所有功能。

代码语言:javascript
复制
<switchery-checkbox
     [(ngModel)]="model.onOrOff"
     ngControl="onOrOff"
     [disabled]="disabledCondition"
     ... >
</switchery-checkbox>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-12 10:32:11

实际上,您需要使组件“ngModel兼容”,但实现自定义值访问器。

下面是做这些事情的方法:

代码语言:javascript
复制
@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();
      }
    }
  }
}

最后,您需要将值访问器注册到组件的providers中:

代码语言:javascript
复制
const CUSTOM_VALUE_ACCESSOR = new Provider(
  NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => SwitcheryComponent), multi: true});

@Component({
  selector: 'switchery-checkbox',
  template: `
    <input #checkbox type="checkbox" (change)="onChange($event.target.checked)" class="js-switch"/>
  `,
  providers: [ CUSTOM_VALUE_ACCESSOR ]
})
export class SwitcheryComponent implements AfterViewInit, ControlValueAccessor {
  (...)
}

这样,您就可以这样使用您的指令:

代码语言:javascript
复制
<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/
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36568126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档