import {Component, Optional, Input, Output, EventEmitter, HostListener, Provider, forwardRef} from 'angular2/core'; import {NG_VALUE_ACCESSOR} from 'angular2/common'; import {Form} from '../../util/form'; import {Item} from '../item/item'; import {isTrueProperty} from '../../util/util'; const CHECKBOX_VALUE_ACCESSOR = new Provider( NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => Checkbox), multi: true}); /** * The checkbox is no different than the HTML checkbox input, except * it's styled accordingly to the the platform and design mode, such * as iOS or Material Design. * * See the [Angular 2 Docs](https://angular.io/docs/ts/latest/guide/forms.html) * for more info on forms and inputs. * * * @usage * ```html * * * * * Pepperoni * * * * * Sausage * * * * * Mushrooms * * * * * ``` * @demo /docs/v2/demos/checkbox/ * @see {@link /docs/v2/components#checkbox Checkbox Component Docs} */ @Component({ selector: 'ion-checkbox', template: '
' + '
' + '
' + '', host: { '[class.checkbox-disabled]': '_disabled' }, providers: [CHECKBOX_VALUE_ACCESSOR] }) export class Checkbox { private _checked: boolean = false; private _disabled: boolean = false; private _labelId: string; private _fn: Function; /** * @private */ id: string; /** * @output {Checkbox} expression to evaluate when the checkbox value changes */ @Output() change: EventEmitter = new EventEmitter(); constructor( private _form: Form, @Optional() private _item: Item ) { _form.register(this); if (_item) { this.id = 'chk-' + _item.registerInput('checkbox'); this._labelId = 'lbl-' + _item.id; this._item.setCssClass('item-checkbox', true); } } /** * @private */ @HostListener('click', ['$event']) private _click(ev) { console.debug('checkbox, checked'); ev.preventDefault(); ev.stopPropagation(); this.onChange(!this._checked); } /** * @input {boolean} whether or not the checkbox is checked (defaults to false) */ @Input() get checked(): boolean { return this._checked; } set checked(val: boolean) { this._setChecked(isTrueProperty(val)); this.onChange(this._checked); } /** * @private */ private _setChecked(isChecked: boolean) { if (isChecked !== this._checked) { this._checked = isChecked; this.change.emit(this); this._item && this._item.setCssClass('item-checkbox-checked', isChecked); } } /** * @private */ writeValue(val: any) { this._setChecked( isTrueProperty(val) ); } /** * @private */ registerOnChange(fn: Function): void { this._fn = fn; this.onChange = (isChecked: boolean) => { console.debug('checkbox, onChange', isChecked); fn(isChecked); this._setChecked(isChecked); this.onTouched(); }; } /** * @private */ registerOnTouched(fn) { this.onTouched = fn; } /** * @input {boolean} whether or not the checkbox is disabled or not. */ @Input() get disabled(): boolean { return this._disabled; } set disabled(val: boolean) { this._disabled = isTrueProperty(val); this._item && this._item.setCssClass('item-checkbox-disabled', this._disabled); } /** * @private */ onChange(isChecked: boolean) { // used when this input does not have an ngModel or ngControl console.debug('checkbox, onChange (no ngModel)', isChecked); this._setChecked(isChecked); this.onTouched(); } /** * @private */ onTouched() {} /** * @private */ ngOnDestroy() { this._form.deregister(this); } }