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

Commit 6a167e8

Browse files
revert:feat(input): add support for binding to input[type=range]
This reverts commit 296da4b
1 parent aa60491 commit 6a167e8

File tree

4 files changed

+6
-645
lines changed

4 files changed

+6
-645
lines changed

docs/content/error/ngModel/numfmt.ngdoc

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
@fullName Model is not of type `number`
44
@description
55

6-
The `input[number]` and `input[range]` directives require the model to be a `number`.
6+
The number input directive `<input type="number">` requires the model to be a `number`.
77

88
If the model is something else, this error will be thrown.
99

src/ng/directive/input.js

+4-218
Original file line numberDiff line numberDiff line change
@@ -1027,113 +1027,6 @@ var inputType = {
10271027
*/
10281028
'radio': radioInputType,
10291029

1030-
/**
1031-
* @ngdoc input
1032-
* @name input[range]
1033-
*
1034-
* @description
1035-
* Native range input with validation and transformation.
1036-
*
1037-
* The model for the range input must always be a `Number`.
1038-
*
1039-
* IE9 and other browsers that do not support the `range` type fall back
1040-
* to a text input. Model binding, validation and number parsing are nevertheless supported.
1041-
*
1042-
* Browsers that support range (latest Chrome, Safari, Firefox, Edge) treat `input[range]`
1043-
* in a way that never allows the input to hold an invalid value. That means:
1044-
* - any non-numerical value is set to `(max + min) / 2`.
1045-
* - any numerical value that is less than the current min val, or greater than the current max val
1046-
* is set to the min / max val respectively.
1047-
*
1048-
* This has the following consequences for Angular:
1049-
*
1050-
* Since the element value should always reflect the current model value, a range input
1051-
* will set the bound ngModel expression to the value that the browser has set for the
1052-
* input element. For example, in the following input `<input type="range" ng-model="model.value">`,
1053-
* if the application sets `model.value = null`, the browser will set the input to `'50'`.
1054-
* Angular will then set the model to `50`, to prevent input and model value being out of sync.
1055-
*
1056-
* That means the model for range will immediately be set to `50` after `ngModel` has been
1057-
* initialized. It also means a range input can never have the required error.
1058-
*
1059-
* This does not only affect changes to the model value, but also to the values of the `min` and
1060-
* `max` attributes. When these change in a way that will cause the browser to modify the input value,
1061-
* Angular will also update the model value.
1062-
*
1063-
* Automatic value adjustment also means that a range input element can never have the `required`,
1064-
* `min`, or `max` errors, except when using `ngMax` and `ngMin`, which are not affected by automatic
1065-
* value adjustment, because they do not set the `min` and `max` attributes.
1066-
*
1067-
* @param {string} ngModel Assignable angular expression to data-bind to.
1068-
* @param {string=} name Property name of the form under which the control is published.
1069-
* @param {string=} min Sets the `min` validation to ensure that the value entered is greater
1070-
* than `min`. Can be interpolated.
1071-
* @param {string=} max Sets the `max` validation to ensure that the value entered is less than `max`.
1072-
* Can be interpolated.
1073-
* @param {string=} ngMin Takes an expression. Sets the `min` validation to ensure that the value
1074-
* entered is greater than `min`. Does not set the `min` attribute and therefore
1075-
* adds no native HTML5 validation. It also means the browser won't adjust the
1076-
* element value in case `min` is greater than the current value.
1077-
* @param {string=} ngMax Takes an expression. Sets the `max` validation to ensure that the value
1078-
* entered is less than `max`. Does not set the `max` attribute and therefore
1079-
* adds no native HTML5 validation. It also means the browser won't adjust the
1080-
* element value in case `max` is less than the current value.
1081-
* @param {string=} ngChange Angular expression to be executed when the ngModel value changes due
1082-
* to user interaction with the input element.
1083-
*
1084-
* @example
1085-
<example name="range-input-directive" module="rangeExample">
1086-
<file name="index.html">
1087-
<script>
1088-
angular.module('rangeExample', [])
1089-
.controller('ExampleController', ['$scope', function($scope) {
1090-
$scope.value = 75;
1091-
$scope.min = 10;
1092-
$scope.max = 90;
1093-
}]);
1094-
</script>
1095-
<form name="myForm" ng-controller="ExampleController">
1096-
1097-
Model as range: <input type="range" name="range" ng-model="value" min="{{min}}" max="{{max}}">
1098-
<hr>
1099-
Model as number: <input type="number" ng-model="value"><br>
1100-
Min: <input type="number" ng-model="min"><br>
1101-
Max: <input type="number" ng-model="max"><br>
1102-
value = <code>{{value}}</code><br/>
1103-
myForm.range.$valid = <code>{{myForm.range.$valid}}</code><br/>
1104-
myForm.range.$error = <code>{{myForm.range.$error}}</code>
1105-
</form>
1106-
</file>
1107-
</example>
1108-
1109-
* ## Range Input with ngMin & ngMax attributes
1110-
1111-
* @example
1112-
<example name="range-input-directive-ng" module="rangeExample">
1113-
<file name="index.html">
1114-
<script>
1115-
angular.module('rangeExample', [])
1116-
.controller('ExampleController', ['$scope', function($scope) {
1117-
$scope.value = 75;
1118-
$scope.min = 10;
1119-
$scope.max = 90;
1120-
}]);
1121-
</script>
1122-
<form name="myForm" ng-controller="ExampleController">
1123-
Model as range: <input type="range" name="range" ng-model="value" ng-min="min" ng-max="max">
1124-
<hr>
1125-
Model as number: <input type="number" ng-model="value"><br>
1126-
Min: <input type="number" ng-model="min"><br>
1127-
Max: <input type="number" ng-model="max"><br>
1128-
value = <code>{{value}}</code><br/>
1129-
myForm.range.$valid = <code>{{myForm.range.$valid}}</code><br/>
1130-
myForm.range.$error = <code>{{myForm.range.$error}}</code>
1131-
</form>
1132-
</file>
1133-
</example>
1134-
1135-
*/
1136-
'range': rangeInputType,
11371030

11381031
/**
11391032
* @ngdoc input
@@ -1485,7 +1378,10 @@ function badInputChecker(scope, element, attr, ctrl) {
14851378
}
14861379
}
14871380

1488-
function numberFormatterParser(ctrl) {
1381+
function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
1382+
badInputChecker(scope, element, attr, ctrl);
1383+
baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
1384+
14891385
ctrl.$$parserName = 'number';
14901386
ctrl.$parsers.push(function(value) {
14911387
if (ctrl.$isEmpty(value)) return null;
@@ -1502,12 +1398,6 @@ function numberFormatterParser(ctrl) {
15021398
}
15031399
return value;
15041400
});
1505-
}
1506-
1507-
function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
1508-
badInputChecker(scope, element, attr, ctrl);
1509-
numberFormatterParser(ctrl);
1510-
baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
15111401

15121402
if (isDefined(attr.min) || attr.ngMin) {
15131403
var minVal;
@@ -1542,110 +1432,6 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
15421432
}
15431433
}
15441434

1545-
function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) {
1546-
badInputChecker(scope, element, attr, ctrl);
1547-
numberFormatterParser(ctrl);
1548-
baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
1549-
1550-
var minVal = 0,
1551-
maxVal = 100,
1552-
supportsRange = ctrl.$$hasNativeValidators && element[0].type === 'range',
1553-
validity = element[0].validity;
1554-
1555-
var originalRender = ctrl.$render;
1556-
1557-
ctrl.$render = supportsRange && isDefined(validity.rangeUnderflow) && isDefined(validity.rangeOverflow) ?
1558-
//Browsers that implement range will set these values automatically, but reading the adjusted values after
1559-
//$render would cause the min / max validators to be applied with the wrong value
1560-
function rangeRender() {
1561-
originalRender();
1562-
ctrl.$setViewValue(element.val());
1563-
} :
1564-
originalRender;
1565-
1566-
function minChange(val) {
1567-
if (isDefined(val) && !isNumber(val)) {
1568-
val = parseFloat(val);
1569-
}
1570-
minVal = isNumber(val) && !isNaN(val) ? val : undefined;
1571-
// ignore changes before model is initialized
1572-
if (isNumberNaN(ctrl.$modelValue)) {
1573-
return;
1574-
}
1575-
1576-
if (supportsRange && minAttrType === 'min') {
1577-
var elVal = element.val();
1578-
// IE11 doesn't set the el val correctly if the minVal is greater than the element value
1579-
if (minVal > elVal) {
1580-
element.val(minVal);
1581-
elVal = minVal;
1582-
}
1583-
ctrl.$setViewValue(elVal);
1584-
} else {
1585-
// TODO(matsko): implement validateLater to reduce number of validations
1586-
ctrl.$validate();
1587-
}
1588-
}
1589-
1590-
var minAttrType = isDefined(attr.ngMin) ? 'ngMin' : isDefined(attr.min) ? 'min' : false;
1591-
if (minAttrType) {
1592-
ctrl.$validators.min = isDefined(attr.min) && supportsRange ?
1593-
function noopMinValidator(value) {
1594-
// Since all browsers set the input to a valid value, we don't need to check validity
1595-
return true;
1596-
} :
1597-
// ngMin doesn't set the min attr, so the browser doesn't adjust the input value as setting min would
1598-
function minValidator(modelValue, viewValue) {
1599-
return ctrl.$isEmpty(viewValue) || isUndefined(minVal) || viewValue >= minVal;
1600-
};
1601-
1602-
// Assign minVal when the directive is linked. This won't run the validators as the model isn't ready yet
1603-
minChange(attr.min);
1604-
attr.$observe('min', minChange);
1605-
}
1606-
1607-
function maxChange(val) {
1608-
if (isDefined(val) && !isNumber(val)) {
1609-
val = parseFloat(val);
1610-
}
1611-
maxVal = isNumber(val) && !isNaN(val) ? val : undefined;
1612-
// ignore changes before model is initialized
1613-
if (isNumberNaN(ctrl.$modelValue)) {
1614-
return;
1615-
}
1616-
1617-
if (supportsRange && maxAttrType === 'max') {
1618-
var elVal = element.val();
1619-
// IE11 doesn't set the el val correctly if the maxVal is less than the element value
1620-
if (maxVal < elVal) {
1621-
element.val(maxVal);
1622-
elVal = minVal;
1623-
}
1624-
ctrl.$setViewValue(elVal);
1625-
} else {
1626-
// TODO(matsko): implement validateLater to reduce number of validations
1627-
ctrl.$validate();
1628-
}
1629-
}
1630-
var maxAttrType = isDefined(attr.max) ? 'max' : attr.ngMax ? 'ngMax' : false;
1631-
if (maxAttrType) {
1632-
ctrl.$validators.max = isDefined(attr.max) && supportsRange ?
1633-
function noopMaxValidator() {
1634-
// Since all browsers set the input to a valid value, we don't need to check validity
1635-
return true;
1636-
} :
1637-
// ngMax doesn't set the max attr, so the browser doesn't adjust the input value as setting max would
1638-
function maxValidator(modelValue, viewValue) {
1639-
return ctrl.$isEmpty(viewValue) || isUndefined(maxVal) || viewValue <= maxVal;
1640-
};
1641-
1642-
// Assign maxVal when the directive is linked. This won't run the validators as the model isn't ready yet
1643-
maxChange(attr.max);
1644-
attr.$observe('max', maxChange);
1645-
}
1646-
1647-
}
1648-
16491435
function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
16501436
// Note: no badInputChecker here by purpose as `url` is only a validation
16511437
// in browsers, i.e. we can always read out input.value even if it is not valid!

src/ng/directive/ngModel.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -883,8 +883,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
883883
ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue;
884884
ctrl.$render();
885885

886-
// It is possible that model and view value have been updated during render
887-
ctrl.$$runValidators(ctrl.$modelValue, ctrl.$viewValue, noop);
886+
ctrl.$$runValidators(modelValue, viewValue, noop);
888887
}
889888
}
890889

0 commit comments

Comments
 (0)