javascript - div - El modelo de entrada cambia de Entero a Cadena cuando se cambia



datos angularjs (3)

Muy similar a la respuesta aceptada de Yanik, excepto que lo intenté y no funcionó. Sin embargo, esta versión de la documentación de AngularJS funciona perfectamente para mí.

.directive('stringToNumber', function() {
    return {
        require: 'ngModel',
        link: function(scope, element, attrs, ngModel) {
          ngModel.$parsers.push(function(value) {
            return '' + value;
          });
          ngModel.$formatters.push(function(value) {
            return parseFloat(value);
          });
        }
      };
    });

https://ffff65535.com

Tener un tipo de rango de precio / funcionalidad de calificación basada en un modelo de entradas. En la carga, cuando se configura desde el back-end, comienza como un entero, pero cuando tecleas, cambia a una cadena. ¿Hay alguna forma en Angular para declarar el valor de una entrada como un número entero?

HTML:

<input type="text" name="sellPrice" id="sellPrice" class="sell-price" data-ng-model="menu.totalPrice" data-ng-change="updateMenuPriceRange()"required>

JS:

$scope.updateAggregatePricing();

if ($scope.menu.totalPrice === 0) {
    $scope.menuPriceRange = "";
} else if ($scope.menu.totalPrice < 10) {
    $scope.menuPriceRange = "$";
} else if ($scope.menu.totalPrice >= 10 && $scope.menu.totalPrice <= 12.50) {
    $scope.menuPriceRange = "$$";
} else if ($scope.menu.totalPrice >= 12.51 && $scope.menu.totalPrice < 15) {
    $scope.menuPriceRange = "$$$";
} if ($scope.menu.totalPrice >= 15) {
    $scope.menuPriceRange = "$$$$";
} else {
    $scope.menuPriceRange = "";
}

Sé que llego tarde, pero pensé que publicaría esta respuesta ya que otras personas podrían estar buscando alternativas.

Puede resolver esto utilizando la función de enlace de directivas AngularJS. El código:

var myMod = angular.module('myModule', []);

myMod.directive('integer', function(){
    return {
        require: 'ngModel',
        link: function(scope, ele, attr, ctrl){
            ctrl.$parsers.unshift(function(viewValue){
                return parseInt(viewValue, 10);
            });
        }
    };
});

Luego, usaría esta directiva en un elemento de entrada para asegurarse de que cualquier valor que ingrese se analice en un entero. (obviamente, este ejemplo no valida la entrada para asegurarse de que lo que se ingresó es, de hecho, un número entero, pero podría implementarlo fácilmente con el uso de expresiones regulares, por ejemplo)

<input type="text" ng-model="model.value" integer />

Se puede encontrar más información sobre este tema en los documentos de AngularJS en los formularios, en la sección de "Validación personalizada": http://docs.angularjs.org/guide/forms .

Editar: Llamada parseInt() actualizada para incluir el radix 10, como lo sugirió adam0101


Terminé analizando el modelo como un entero antes de mi condicional.

$scope.menu.totalPrice = parseInt($scope.menu.totalPrice, 10);




integer