Skip to content

Commit ce87e55

Browse files
authored
fix(material/slider): aria-valuetext host binding should be onPush compatible (#29042)
`MatSlider` updates `_valuetext` without marking for check. The easiest way to fix these types of issues when values are not part of the public API is to switch them to signals.
1 parent 5398170 commit ce87e55

File tree

4 files changed

+8
-6
lines changed

4 files changed

+8
-6
lines changed

src/material/slider/slider-input.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
numberAttribute,
2121
OnDestroy,
2222
Output,
23+
signal,
2324
} from '@angular/core';
2425
import {ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR} from '@angular/forms';
2526
import {Subject} from 'rxjs';
@@ -69,7 +70,7 @@ export const MAT_SLIDER_RANGE_THUMB_VALUE_ACCESSOR: any = {
6970
host: {
7071
'class': 'mdc-slider__input',
7172
'type': 'range',
72-
'[attr.aria-valuetext]': '_valuetext',
73+
'[attr.aria-valuetext]': '_valuetext()',
7374
'(change)': '_onChange()',
7475
'(input)': '_onInput()',
7576
// TODO(wagnermaciel): Consider using a global event listener instead.
@@ -211,7 +212,7 @@ export class MatSliderThumb implements _MatSliderThumb, OnDestroy, ControlValueA
211212
_hostElement: HTMLInputElement;
212213

213214
/** The aria-valuetext string representation of the input's value. */
214-
_valuetext: string;
215+
_valuetext = signal('');
215216

216217
/** The radius of a native html slider's knob. */
217218
_knobRadius: number = 8;

src/material/slider/slider-interface.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88

9-
import {InjectionToken, ChangeDetectorRef} from '@angular/core';
9+
import {InjectionToken, ChangeDetectorRef, WritableSignal} from '@angular/core';
1010
import {MatRipple, RippleGlobalOptions} from '@angular/material/core';
1111

1212
/**
@@ -183,7 +183,7 @@ export interface _MatSliderThumb {
183183
_isFocused: boolean;
184184

185185
/** The aria-valuetext string representation of the input's value. */
186-
_valuetext: string;
186+
_valuetext: WritableSignal<string>;
187187

188188
/**
189189
* Indicates whether UI updates should be skipped.

src/material/slider/slider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,7 @@ export class MatSlider implements AfterViewInit, OnDestroy, _MatSlider {
726726
const valuetext = this.displayWith(source.value);
727727

728728
this._hasViewInitialized
729-
? (source._valuetext = valuetext)
729+
? source._valuetext.set(valuetext)
730730
: source._hostElement.setAttribute('aria-valuetext', valuetext);
731731

732732
if (this.discrete) {

tools/public_api_guard/material/slider.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { QueryList } from '@angular/core';
1919
import { RippleGlobalOptions } from '@angular/material/core';
2020
import { Subject } from 'rxjs';
2121
import { ThemePalette } from '@angular/material/core';
22+
import { WritableSignal } from '@angular/core';
2223

2324
// @public
2425
export class MatSlider implements AfterViewInit, OnDestroy, _MatSlider {
@@ -290,7 +291,7 @@ export class MatSliderThumb implements _MatSliderThumb, OnDestroy, ControlValueA
290291
get value(): number;
291292
set value(value: number);
292293
readonly valueChange: EventEmitter<number>;
293-
_valuetext: string;
294+
_valuetext: WritableSignal<string>;
294295
writeValue(value: any): void;
295296
// (undocumented)
296297
static ɵdir: i0.ɵɵDirectiveDeclaration<MatSliderThumb, "input[matSliderThumb]", ["matSliderThumb"], { "value": { "alias": "value"; "required": false; }; }, { "valueChange": "valueChange"; "dragStart": "dragStart"; "dragEnd": "dragEnd"; }, never, never, true, never>;

0 commit comments

Comments
 (0)