Skip to content

Commit 7f50d11

Browse files
mmalerbakara
authored andcommitted
fix(slider): fire change event on value change via keyboard. (#2807)
1 parent 453fa7f commit 7f50d11

File tree

2 files changed

+71
-7
lines changed

2 files changed

+71
-7
lines changed

src/lib/slider/slider.spec.ts

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {async, ComponentFixture, TestBed} from '@angular/core/testing';
2-
import {ReactiveFormsModule, FormControl} from '@angular/forms';
2+
import {ReactiveFormsModule, FormControl, FormsModule} from '@angular/forms';
33
import {Component, DebugElement} from '@angular/core';
44
import {By, HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';
55
import {MdSlider, MdSliderModule} from './slider';
@@ -22,7 +22,7 @@ describe('MdSlider', () => {
2222

2323
beforeEach(async(() => {
2424
TestBed.configureTestingModule({
25-
imports: [MdSliderModule.forRoot(), RtlModule.forRoot(), ReactiveFormsModule],
25+
imports: [MdSliderModule.forRoot(), RtlModule.forRoot(), ReactiveFormsModule, FormsModule],
2626
declarations: [
2727
StandardSlider,
2828
DisabledSlider,
@@ -33,7 +33,8 @@ describe('MdSlider', () => {
3333
SliderWithSetTickInterval,
3434
SliderWithThumbLabel,
3535
SliderWithOneWayBinding,
36-
SliderWithTwoWayBinding,
36+
SliderWithFormControl,
37+
SliderWithNgModel,
3738
SliderWithValueSmallerThanMin,
3839
SliderWithValueGreaterThanMax,
3940
SliderWithChangeHandler,
@@ -585,15 +586,15 @@ describe('MdSlider', () => {
585586
});
586587

587588
describe('slider as a custom form control', () => {
588-
let fixture: ComponentFixture<SliderWithTwoWayBinding>;
589+
let fixture: ComponentFixture<SliderWithFormControl>;
589590
let sliderDebugElement: DebugElement;
590591
let sliderNativeElement: HTMLElement;
591592
let sliderInstance: MdSlider;
592593
let sliderWrapperElement: HTMLElement;
593-
let testComponent: SliderWithTwoWayBinding;
594+
let testComponent: SliderWithFormControl;
594595

595596
beforeEach(() => {
596-
fixture = TestBed.createComponent(SliderWithTwoWayBinding);
597+
fixture = TestBed.createComponent(SliderWithFormControl);
597598
fixture.detectChanges();
598599

599600
testComponent = fixture.debugElement.componentInstance;
@@ -684,7 +685,54 @@ describe('MdSlider', () => {
684685
expect(sliderControl.pristine).toBe(false);
685686
expect(sliderControl.touched).toBe(true);
686687
});
688+
});
689+
690+
describe('slider with ngModel', () => {
691+
let fixture: ComponentFixture<SliderWithNgModel>;
692+
let sliderDebugElement: DebugElement;
693+
let sliderNativeElement: HTMLElement;
694+
let sliderInstance: MdSlider;
695+
let sliderWrapperElement: HTMLElement;
696+
let testComponent: SliderWithNgModel;
697+
698+
beforeEach(() => {
699+
fixture = TestBed.createComponent(SliderWithNgModel);
700+
fixture.detectChanges();
701+
702+
testComponent = fixture.debugElement.componentInstance;
703+
704+
sliderDebugElement = fixture.debugElement.query(By.directive(MdSlider));
705+
sliderNativeElement = sliderDebugElement.nativeElement;
706+
sliderInstance = sliderDebugElement.injector.get(MdSlider);
707+
sliderWrapperElement = <HTMLElement>sliderNativeElement.querySelector('.md-slider-wrapper');
708+
});
709+
710+
it('should update the model on click', () => {
711+
expect(testComponent.val).toBe(0);
687712

713+
dispatchClickEventSequence(sliderNativeElement, 0.76);
714+
fixture.detectChanges();
715+
716+
expect(testComponent.val).toBe(76);
717+
});
718+
719+
it('should update the model on slide', () => {
720+
expect(testComponent.val).toBe(0);
721+
722+
dispatchSlideEventSequence(sliderNativeElement, 0, 0.19, gestureConfig);
723+
fixture.detectChanges();
724+
725+
expect(testComponent.val).toBe(19);
726+
});
727+
728+
it('should update the model on keydown', () => {
729+
expect(testComponent.val).toBe(0);
730+
731+
dispatchKeydownEvent(sliderNativeElement, UP_ARROW);
732+
fixture.detectChanges();
733+
734+
expect(testComponent.val).toBe(1);
735+
});
688736
});
689737

690738
describe('slider with value property binding', () => {
@@ -1222,10 +1270,18 @@ class SliderWithOneWayBinding {
12221270
template: `<md-slider [formControl]="control"></md-slider>`,
12231271
styles: [styles],
12241272
})
1225-
class SliderWithTwoWayBinding {
1273+
class SliderWithFormControl {
12261274
control = new FormControl(0);
12271275
}
12281276

1277+
@Component({
1278+
template: `<md-slider [(ngModel)]="val"></md-slider>`,
1279+
styles: [styles],
1280+
})
1281+
class SliderWithNgModel {
1282+
val = 0;
1283+
}
1284+
12291285
@Component({
12301286
template: `<md-slider value="3" min="4" max="6"></md-slider>`,
12311287
styles: [styles],

src/lib/slider/slider.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export class MdSliderChange {
7575
'(blur)': '_onBlur()',
7676
'(click)': '_onClick($event)',
7777
'(keydown)': '_onKeydown($event)',
78+
'(keyup)': '_onKeyup()',
7879
'(mouseenter)': '_onMouseenter()',
7980
'(slide)': '_onSlide($event)',
8081
'(slideend)': '_onSlideEnd()',
@@ -485,12 +486,19 @@ export class MdSlider implements ControlValueAccessor {
485486
return;
486487
}
487488

489+
this._isSliding = true;
488490
event.preventDefault();
489491
}
490492

493+
_onKeyup() {
494+
this._isSliding = false;
495+
}
496+
491497
/** Increments the slider by the given number of steps (negative number decrements). */
492498
private _increment(numSteps: number) {
493499
this.value = this._clamp(this.value + this.step * numSteps, this.min, this.max);
500+
this._emitInputEvent();
501+
this._emitValueIfChanged();
494502
}
495503

496504
/** Calculate the new value from the new physical location. The value will always be snapped. */

0 commit comments

Comments
 (0)