Skip to content

Commit f11c5eb

Browse files
tinayuangaommalerba
authored andcommitted
fix(checkbox): Emit event when checkbox's indeterminate value changes (#2130)
* Emit event when checkbox indeterminate value changes * Add test * Use boolean and emit indeterminate only if value changed
1 parent 46e654b commit f11c5eb

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

src/lib/checkbox/checkbox.spec.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,39 @@ describe('MdCheckbox', () => {
104104
expect(inputElement.indeterminate).toBe(false);
105105
});
106106

107+
it('should set indeterminate to false when set checked', () => {
108+
testComponent.isIndeterminate = true;
109+
fixture.detectChanges();
110+
111+
expect(checkboxInstance.indeterminate).toBe(true);
112+
expect(inputElement.indeterminate).toBe(true);
113+
expect(testComponent.isIndeterminate).toBe(true);
114+
115+
testComponent.isChecked = true;
116+
fixture.detectChanges();
117+
118+
expect(checkboxInstance.checked).toBe(true);
119+
expect(inputElement.indeterminate).toBe(false);
120+
expect(inputElement.checked).toBe(true);
121+
expect(testComponent.isIndeterminate).toBe(false);
122+
123+
testComponent.isIndeterminate = true;
124+
fixture.detectChanges();
125+
126+
expect(checkboxInstance.indeterminate).toBe(true);
127+
expect(inputElement.indeterminate).toBe(true);
128+
expect(inputElement.checked).toBe(true);
129+
expect(testComponent.isIndeterminate).toBe(true);
130+
131+
testComponent.isChecked = false;
132+
fixture.detectChanges();
133+
134+
expect(checkboxInstance.checked).toBe(false);
135+
expect(inputElement.indeterminate).toBe(false);
136+
expect(inputElement.checked).toBe(false);
137+
expect(testComponent.isIndeterminate).toBe(false);
138+
});
139+
107140
it('should change native element checked when check programmatically', () => {
108141
expect(inputElement.checked).toBe(false);
109142

@@ -627,7 +660,7 @@ describe('MdCheckbox', () => {
627660
[required]="isRequired"
628661
[labelPosition]="labelPos"
629662
[checked]="isChecked"
630-
[indeterminate]="isIndeterminate"
663+
[(indeterminate)]="isIndeterminate"
631664
[disabled]="isDisabled"
632665
[color]="checkboxColor"
633666
(change)="changeCount = changeCount + 1"

src/lib/checkbox/checkbox.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ export class MdCheckbox implements ControlValueAccessor {
147147
/** Event emitted when the checkbox's `checked` value changes. */
148148
@Output() change: EventEmitter<MdCheckboxChange> = new EventEmitter<MdCheckboxChange>();
149149

150+
/** Event emitted when the checkbox's `indeterminate` value changes. */
151+
@Output() indeterminateChange: EventEmitter<boolean> = new EventEmitter<boolean>();
152+
150153
/** The native `<input type="checkbox"> element */
151154
@ViewChild('input') _inputElement: ElementRef;
152155

@@ -186,7 +189,10 @@ export class MdCheckbox implements ControlValueAccessor {
186189

187190
set checked(checked: boolean) {
188191
if (checked != this.checked) {
189-
this._indeterminate = false;
192+
if (this._indeterminate) {
193+
this._indeterminate = false;
194+
this.indeterminateChange.emit(this._indeterminate);
195+
}
190196
this._checked = checked;
191197
this._transitionCheckState(
192198
this._checked ? TransitionCheckState.Checked : TransitionCheckState.Unchecked);
@@ -208,13 +214,17 @@ export class MdCheckbox implements ControlValueAccessor {
208214
}
209215

210216
set indeterminate(indeterminate: boolean) {
217+
let changed = indeterminate != this._indeterminate;
211218
this._indeterminate = indeterminate;
212219
if (this._indeterminate) {
213220
this._transitionCheckState(TransitionCheckState.Indeterminate);
214221
} else {
215222
this._transitionCheckState(
216223
this.checked ? TransitionCheckState.Checked : TransitionCheckState.Unchecked);
217224
}
225+
if (changed) {
226+
this.indeterminateChange.emit(this._indeterminate);
227+
}
218228
}
219229

220230
/** The color of the button. Can be `primary`, `accent`, or `warn`. */

0 commit comments

Comments
 (0)