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

Commit ebaa0f5

Browse files
gkalpakNarretz
authored andcommitted
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 Closes #11774
1 parent bb15d41 commit ebaa0f5

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

src/ngAria/aria.js

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

test/ngAria/ariaSpec.js

+30
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,36 @@ describe('$aria', function() {
549549
expectAriaAttrOnEachElement(element, 'aria-valuemin', 'userSetValue2');
550550
expectAriaAttrOnEachElement(element, 'aria-valuemax', 'userSetValue3');
551551
});
552+
553+
554+
it('should update `aria-valuemin/max` when `min/max` changes dynamically', function() {
555+
scope.$apply('min = 25; max = 75');
556+
compileElement('<input type="range" ng-model="val" min="{{min}}" max="{{max}}" />');
557+
558+
expect(element.attr('aria-valuemin')).toBe('25');
559+
expect(element.attr('aria-valuemax')).toBe('75');
560+
561+
scope.$apply('min = 0');
562+
expect(element.attr('aria-valuemin')).toBe('0');
563+
564+
scope.$apply('max = 100');
565+
expect(element.attr('aria-valuemax')).toBe('100');
566+
});
567+
568+
569+
it('should update `aria-valuemin/max` when `ng-min/ng-max` changes dynamically', function() {
570+
scope.$apply('min = 25; max = 75');
571+
compileElement('<input type="range" ng-model="val" ng-min="min" ng-max="max" />');
572+
573+
expect(element.attr('aria-valuemin')).toBe('25');
574+
expect(element.attr('aria-valuemax')).toBe('75');
575+
576+
scope.$apply('min = 0');
577+
expect(element.attr('aria-valuemin')).toBe('0');
578+
579+
scope.$apply('max = 100');
580+
expect(element.attr('aria-valuemax')).toBe('100');
581+
});
552582
});
553583

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

0 commit comments

Comments
 (0)