Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 449ef08

Browse files
committed
fix(ngAria): update aria-valuemin/max when min/max change
As a result of thi fix, `ngMin/Max` also set `aria-valuemin/max` on "range"-shaped elements. Fixes #11770
1 parent 0681a54 commit 449ef08

File tree

2 files changed

+43
-5
lines changed

2 files changed

+43
-5
lines changed

src/ngAria/aria.js

+15-5
Original file line numberDiff line numberDiff line change
@@ -265,13 +265,23 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) {
265265
elem.attr('role', 'slider');
266266
}
267267
if ($aria.config('ariaValue')) {
268-
if (attr.min && !elem.attr('aria-valuemin')) {
269-
elem.attr('aria-valuemin', attr.min);
268+
var needsAriaValuemin = !elem.attr('aria-valuemin') &&
269+
(attr.hasOwnProperty('min') || attr.hasOwnProperty('ngMin'));
270+
var needsAriaValuemax = !elem.attr('aria-valuemax') &&
271+
(attr.hasOwnProperty('max') || attr.hasOwnProperty('ngMax'));
272+
var needsAriaValuenow = !elem.attr('aria-valuenow');
273+
274+
if (needsAriaValuemin) {
275+
attr.$observe('min', function ngAriaValueMinReaction(newVal) {
276+
elem.attr('aria-valuemin', newVal);
277+
});
270278
}
271-
if (attr.max && !elem.attr('aria-valuemax')) {
272-
elem.attr('aria-valuemax', attr.max);
279+
if (needsAriaValuemax) {
280+
attr.$observe('max', function ngAriaValueMinReaction(newVal) {
281+
elem.attr('aria-valuemax', newVal);
282+
});
273283
}
274-
if (!elem.attr('aria-valuenow')) {
284+
if (needsAriaValuenow) {
275285
scope.$watch(ngAriaWatchModelValue, function ngAriaValueNowReaction(newVal) {
276286
elem.attr('aria-valuenow', newVal);
277287
});

test/ngAria/ariaSpec.js

+28
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,34 @@ describe('$aria', function() {
510510
expectAriaAttrOnEachElement(element, 'aria-valuemin', 'userSetValue2');
511511
expectAriaAttrOnEachElement(element, 'aria-valuemax', 'userSetValue3');
512512
});
513+
514+
it('should update `aria-valuemin/max` when `min/max` changes dynamically', function() {
515+
scope.$apply('min = 25; max = 75');
516+
compileElement('<input type="range" ng-model="val" min="{{min}}" max="{{max}}" />');
517+
518+
expect(element.attr('aria-valuemin')).toBe('25');
519+
expect(element.attr('aria-valuemax')).toBe('75');
520+
521+
scope.$apply('min = 0');
522+
expect(element.attr('aria-valuemin')).toBe('0');
523+
524+
scope.$apply('max = 100');
525+
expect(element.attr('aria-valuemax')).toBe('100');
526+
});
527+
528+
it('should update `aria-valuemin/max` when `ng-min/ng-max` changes dynamically', function() {
529+
scope.$apply('min = 25; max = 75');
530+
compileElement('<input type="range" ng-model="val" ng-min="min" ng-max="max" />');
531+
532+
expect(element.attr('aria-valuemin')).toBe('25');
533+
expect(element.attr('aria-valuemax')).toBe('75');
534+
535+
scope.$apply('min = 0');
536+
expect(element.attr('aria-valuemin')).toBe('0');
537+
538+
scope.$apply('max = 100');
539+
expect(element.attr('aria-valuemax')).toBe('100');
540+
});
513541
});
514542

515543
describe('announcing ngMessages', function() {

0 commit comments

Comments
 (0)