2013-02-25 35 views
34

Có một loại chức năng giá/xếp hạng giá dựa trên mô hình đầu vào. Khi tải, khi nó được đặt từ chương trình phụ trợ, nó bắt đầu như một số nguyên, nhưng khi bạn nhập vào nó, nó sẽ thay đổi thành một chuỗi. Có cách nào trong Angular để khai báo giá trị của một đầu vào là số nguyên?Thay đổi mô hình đầu vào từ Số nguyên thành Chuỗi khi thay đổi

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 = ""; 
} 

Trả lời

85

Tôi biết mình đã trễ nhưng tôi nghĩ mình sẽ đăng câu trả lời này vì người khác vẫn có thể tìm kiếm giải pháp thay thế.

Bạn có thể giải quyết vấn đề này bằng cách sử dụng chức năng liên kết chỉ thị AngularJS. Mã:

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); 
      }); 
     } 
    }; 
}); 

Sau đó, bạn sẽ sử dụng chỉ thị này trên một yếu tố đầu vào để đảm bảo rằng bất kỳ giá trị mà bạn nhập, được phân tách thành một số nguyên. (rõ ràng ví dụ này không hợp lệ hóa đầu vào để đảm bảo rằng những gì đã được nhập thực chất là một số nguyên, nhưng bạn có thể dễ dàng thực hiện điều này với việc sử dụng các biểu thức thông thường ví dụ)

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

Thông tin thêm về chủ đề này có thể được tìm thấy trên tài liệu AngularJS trên biểu mẫu, ngay bên cạnh phần "Xác thực tùy chỉnh": http://docs.angularjs.org/guide/forms.

Edit: Cập nhật parseInt() gọi để bao gồm các radix 10, theo đề nghị của adam0101

+1

Cảm ơn! Điều này đã giúp với một vấn đề tôi đã có nơi tôi đã có các nút radio với các giá trị ràng buộc với cùng một mô hình như một đầu vào (loại = số). – Dave

+0

Bạn đang rất hoan nghênh! Tôi vui vì nó giúp bạn. –

+0

Aha! Tôi biết phải có một cách ít ỏi để làm điều này hơn những gì tôi đã làm. :) Cảm ơn! –

22

Có, sử dụng đầu vào của loại number:

<input type="number" name="sellPrice" ...> 
+1

Thực sự là số thập phân và đầu vào số html5 dường như không hoạt động. Cảm ơn mặc dù! –

+1

đối với tôi, nó cũng hoạt động với số thập phân (chrome) –

+1

Không hoạt động trong IE 9. Giá trị mô hình sẽ được đặt thành chuỗi cho IE9 –

8

Đã kết thúc phân tích các mô hình như một số nguyên trước khi có điều kiện của tôi.

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

Đó là một số thập phân để parseFloat ($ scope.menu.totalPrice) là giải pháp tốt hơn – Sudharshan

+0

Tôi đồng ý! Tôi nghĩ rằng giải pháp Yaniks hoạt động hoàn hảo mặc dù. –

0

Rất giống với câu trả lời chấp nhận từ Yanik, ngoại trừ tôi đã cố gắng đó và nó đã không làm việc. Tuy nhiên, This version from the AngularJS documentation hoạt động hoàn hảo cho tôi.

.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); 
      }); 
     } 
     }; 
    }); 
Các vấn đề liên quan