Skip to content

Commit 8e7f80d

Browse files
mmalerbajelbourn
authored andcommitted
fix(slider): update thumb position when value changes. Closes #1386 (#1610)
1 parent f10ac7c commit 8e7f80d

File tree

4 files changed

+65
-1
lines changed

4 files changed

+65
-1
lines changed

src/demo-app/slider/slider-demo.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ <h1>Slider with set tick interval</h1>
2424
<h1>Slider with Thumb Label</h1>
2525
<md-slider thumb-label></md-slider>
2626

27+
<h1>Slider with one-way binding</h1>
28+
<md-slider [value]="val" step="40"></md-slider>
29+
<input [(ngModel)]="val">
30+
2731
<h1>Slider with two-way binding</h1>
2832
<md-slider [(ngModel)]="demo" step="40"></md-slider>
2933
<input [(ngModel)]="demo">

src/demo-app/slider/slider-demo.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ import {Component} from '@angular/core';
88
})
99
export class SliderDemo {
1010
demo: number;
11+
val: number = 50;
1112
}

src/lib/slider/slider.spec.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ describe('MdSlider', () => {
2222
SliderWithAutoTickInterval,
2323
SliderWithSetTickInterval,
2424
SliderWithThumbLabel,
25+
SliderWithOneWayBinding,
2526
SliderWithTwoWayBinding,
2627
],
2728
providers: [
@@ -621,6 +622,54 @@ describe('MdSlider', () => {
621622

622623
// TODO: Add tests for ng-pristine, ng-touched, ng-invalid.
623624
});
625+
626+
describe('slider with value property binding', () => {
627+
let fixture: ComponentFixture<SliderWithOneWayBinding>;
628+
let sliderDebugElement: DebugElement;
629+
let sliderNativeElement: HTMLElement;
630+
let sliderInstance: MdSlider;
631+
let sliderTrackElement: HTMLElement;
632+
let testComponent: SliderWithOneWayBinding;
633+
let trackFillElement: HTMLElement;
634+
let thumbElement: HTMLElement;
635+
let sliderDimensions: ClientRect;
636+
637+
beforeEach(() => {
638+
fixture = TestBed.createComponent(SliderWithOneWayBinding);
639+
fixture.detectChanges();
640+
641+
testComponent = fixture.debugElement.componentInstance;
642+
643+
sliderDebugElement = fixture.debugElement.query(By.directive(MdSlider));
644+
sliderNativeElement = sliderDebugElement.nativeElement;
645+
sliderInstance = sliderDebugElement.injector.get(MdSlider);
646+
sliderTrackElement = <HTMLElement>sliderNativeElement.querySelector('.md-slider-track');
647+
trackFillElement = <HTMLElement>sliderNativeElement.querySelector('.md-slider-track-fill');
648+
thumbElement = <HTMLElement>sliderNativeElement.querySelector('.md-slider-thumb-position');
649+
sliderDimensions = sliderTrackElement.getBoundingClientRect();
650+
});
651+
652+
it('should initialize based on bound value', () => {
653+
let trackFillDimensions = trackFillElement.getBoundingClientRect();
654+
let thumbDimensions = thumbElement.getBoundingClientRect();
655+
let thumbPosition = thumbDimensions.left - trackFillDimensions.left;
656+
657+
expect(sliderInstance.value).toBe(50);
658+
expect(thumbPosition).toBe(sliderDimensions.width / 2);
659+
});
660+
661+
it('should update when bound value changes', () => {
662+
testComponent.val = 75;
663+
fixture.detectChanges();
664+
665+
let trackFillDimensions = trackFillElement.getBoundingClientRect();
666+
let thumbDimensions = thumbElement.getBoundingClientRect();
667+
let thumbPosition = thumbDimensions.left - trackFillDimensions.left;
668+
669+
expect(sliderInstance.value).toBe(75);
670+
expect(thumbPosition).toBe(sliderDimensions.width * 3 / 4);
671+
});
672+
});
624673
});
625674

626675
// The transition has to be removed in order to test the updated positions without setTimeout.
@@ -671,6 +720,13 @@ class SliderWithSetTickInterval { }
671720
})
672721
class SliderWithThumbLabel { }
673722

723+
@Component({
724+
template: `<md-slider [value]="val"></md-slider>`
725+
})
726+
class SliderWithOneWayBinding {
727+
val = 50;
728+
}
729+
674730
@Component({
675731
template: `<md-slider [formControl]="control"></md-slider>`
676732
})

src/lib/slider/slider.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ export class MdSlider implements AfterContentInit, ControlValueAccessor {
154154
this._value = Number(v);
155155
this._isInitialized = true;
156156
this._controlValueAccessorChangeFn(this._value);
157+
this.snapThumbToValue();
157158
}
158159

159160
constructor(elementRef: ElementRef) {
@@ -265,7 +266,9 @@ export class MdSlider implements AfterContentInit, ControlValueAccessor {
265266
*/
266267
snapThumbToValue() {
267268
this.updatePercentFromValue();
268-
this._renderer.updateThumbAndFillPosition(this._percent, this._sliderDimensions.width);
269+
if (this._sliderDimensions) {
270+
this._renderer.updateThumbAndFillPosition(this._percent, this._sliderDimensions.width);
271+
}
269272
}
270273

271274
/**

0 commit comments

Comments
 (0)