@@ -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-
16491435function 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!
0 commit comments