From 730cccdc973e5f4e2b2c34a095f1cd100eabb50f Mon Sep 17 00:00:00 2001
From: Adam Bradley
Date: Sat, 20 Feb 2016 21:59:43 -0600
Subject: [PATCH] feat(toggle): add change event
Related #5513
---
ionic/components/checkbox/checkbox.ts | 12 +++----
ionic/components/toggle/test/basic/index.ts | 17 +++++++---
ionic/components/toggle/test/basic/main.html | 12 +++----
ionic/components/toggle/toggle.ts | 33 ++++++++++++++------
4 files changed, 47 insertions(+), 27 deletions(-)
diff --git a/ionic/components/checkbox/checkbox.ts b/ionic/components/checkbox/checkbox.ts
index 9bbd050882..bcb2d8dad1 100644
--- a/ionic/components/checkbox/checkbox.ts
+++ b/ionic/components/checkbox/checkbox.ts
@@ -62,8 +62,8 @@ const CHECKBOX_VALUE_ACCESSOR = new Provider(
providers: [CHECKBOX_VALUE_ACCESSOR]
})
export class Checkbox {
- private _checked: any = false;
- private _disabled: any = false;
+ private _checked: boolean = false;
+ private _disabled: boolean = false;
private _labelId: string;
private _fn: Function;
@@ -105,11 +105,11 @@ export class Checkbox {
* @input {boolean} whether or not the checkbox is checked (defaults to false)
*/
@Input()
- get checked() {
+ get checked(): boolean {
return this._checked;
}
- set checked(val) {
+ set checked(val: boolean) {
this._setChecked(isTrueProperty(val));
this.onChange(this._checked);
}
@@ -154,11 +154,11 @@ export class Checkbox {
* @input {boolean} whether or not the checkbox is disabled or not.
*/
@Input()
- get disabled(): any {
+ get disabled(): boolean {
return this._disabled;
}
- set disabled(val: any) {
+ set disabled(val: boolean) {
this._disabled = isTrueProperty(val);
this._item && this._item.setCssClass('item-checkbox-disabled', this._disabled);
}
diff --git a/ionic/components/toggle/test/basic/index.ts b/ionic/components/toggle/test/basic/index.ts
index 14930b585e..171c4ad97f 100644
--- a/ionic/components/toggle/test/basic/index.ts
+++ b/ionic/components/toggle/test/basic/index.ts
@@ -18,8 +18,8 @@ class E2EApp {
fruitsForm: ControlGroup;
grapeDisabled: boolean;
grapeChecked: boolean;
- kiwiModel: boolean;
- strawberryModel: boolean;
+ kiwiValue: boolean;
+ strawberryValue: boolean;
formResults: string;
constructor() {
@@ -32,9 +32,6 @@ class E2EApp {
this.grapeChecked = true;
this.grapeDisabled = true;
-
- this.kiwiModel = true;
- this.strawberryModel = false;
}
toggleGrapeChecked() {
@@ -45,6 +42,16 @@ class E2EApp {
this.grapeDisabled = !this.grapeDisabled;
}
+ kiwiChange(ev) {
+ console.log('kiwiChange', ev);
+ this.kiwiValue = ev.checked;
+ }
+
+ strawberryChange(ev) {
+ console.log('strawberryChange', ev);
+ this.strawberryValue = ev.checked;
+ }
+
doSubmit(ev) {
console.log('Submitting form', this.fruitsForm.value);
this.formResults = JSON.stringify(this.fruitsForm.value);
diff --git a/ionic/components/toggle/test/basic/main.html b/ionic/components/toggle/test/basic/main.html
index 5d537a89a2..731810e576 100644
--- a/ionic/components/toggle/test/basic/main.html
+++ b/ionic/components/toggle/test/basic/main.html
@@ -28,13 +28,13 @@
- Kiwi, NgModel false, Secondary color
-
+ Kiwi, (change) Secondary color
+
- Strawberry, NgModel true
-
+ Strawberry, (change) [checked]="true"
+
@@ -56,8 +56,8 @@
cherry.value: {{fruitsForm.controls.cherryCtrl.value}}
grape.dirty: {{fruitsForm.controls.grapeCtrl.dirty}}
grape.value: {{fruitsForm.controls.grapeCtrl.value}}
- kiwiModel: {{kiwiModel}}
- strawberryModel: {{strawberryModel}}
+ kiwiValue: {{kiwiValue}}
+ strawberryValue: {{strawberryValue}}
{{formResults}}
diff --git a/ionic/components/toggle/toggle.ts b/ionic/components/toggle/toggle.ts
index 351cf33098..826f5b6025 100644
--- a/ionic/components/toggle/toggle.ts
+++ b/ionic/components/toggle/toggle.ts
@@ -1,4 +1,4 @@
-import {Component, ElementRef, Renderer, Input, Optional, Provider, forwardRef} from 'angular2/core';
+import {Component, ElementRef, Renderer, Input, Output, EventEmitter, Optional, Provider, forwardRef} from 'angular2/core';
import {ControlValueAccessor, NG_VALUE_ACCESSOR} from 'angular2/common';
import {Form} from '../../util/form';
@@ -76,8 +76,8 @@ const TOGGLE_VALUE_ACCESSOR = new Provider(
providers: [TOGGLE_VALUE_ACCESSOR]
})
export class Toggle implements ControlValueAccessor {
- private _checked: any = false;
- private _disabled: any = false;
+ private _checked: boolean = false;
+ private _disabled: boolean = false;
private _labelId: string;
private _activated: boolean = false;
private _startX: number;
@@ -89,6 +89,11 @@ export class Toggle implements ControlValueAccessor {
*/
id: string;
+ /**
+ * @output {Toggle} expression to evaluate when the toggle value changes
+ */
+ @Output() change: EventEmitter = new EventEmitter();
+
constructor(
private _form: Form,
private _elementRef: ElementRef,
@@ -170,11 +175,11 @@ export class Toggle implements ControlValueAccessor {
}
@Input()
- get checked(): any {
+ get checked(): boolean {
return this._checked;
}
- set checked(val: any) {
+ set checked(val: boolean) {
this._setChecked(isTrueProperty(val));
this.onChange(this._checked);
}
@@ -183,8 +188,11 @@ export class Toggle implements ControlValueAccessor {
* @private
*/
private _setChecked(isChecked: boolean) {
- this._checked = isChecked;
- this._item && this._item.setCssClass('item-toggle-checked', isChecked);
+ if (isChecked !== this._checked) {
+ this._checked = isChecked;
+ this.change.emit(this);
+ this._item && this._item.setCssClass('item-toggle-checked', isChecked);
+ }
}
/**
@@ -213,11 +221,11 @@ export class Toggle implements ControlValueAccessor {
registerOnTouched(fn) { this.onTouched = fn; }
@Input()
- get disabled(): any {
+ get disabled(): boolean {
return this._disabled;
}
- set disabled(val: any) {
+ set disabled(val: boolean) {
this._disabled = isTrueProperty(val);
this._item && this._item.setCssClass('item-toggle-disabled', this._disabled);
}
@@ -225,7 +233,12 @@ export class Toggle implements ControlValueAccessor {
/**
* @private
*/
- onChange(_) {}
+ onChange(isChecked: boolean) {
+ // used when this input does not have an ngModel or ngControl
+ console.debug('toggle, onChange (no ngModel)', isChecked);
+ this._setChecked(isChecked);
+ this.onTouched();
+ }
/**
* @private