2013-11-10 2 views
28

Я пытаюсь написать директиву, которая автоматически форматирует число в <input>, но модель не отформатирована. Как работать, это нормально, при загрузке значение на входе отображается как 1 000 000 и 1000000 в контроллере, однако при вводе только ngModel.$parsers срабатывает функция. Единственный раз, когда ngModel.$formatters огонь, когда директива загружается и, если значение равно 0.Формат входного значения в Angularjs

Как я могу заставить его работать на нажатие клавиши (я пытался связывание с/KeyUp при нажатии на кнопку, но она не работает) ,

Вот мой код:

angular.module('myApp.directives', []).directive('filterInput', ['$filter', function($filter) { 
    return { 
     restrict: 'A', 
     require: 'ngModel', 
     link: function(scope, element, attr, ngModel) { 

      ngModel.$parsers.push(function fromUser(text) { 
       return parseInt(text.replace(",", "")); 
      }); 

      ngModel.$formatters.push(function toUser(text) { 
       console.log($filter('number')(text)); 
       return ($filter('number')(text || '')); 
      }); 

     } 
    }; 
}]); 

ответ

47

Вот рабочий пример, где мы используем unshift:

angular.module('myApp.directives', []).directive('format', ['$filter', function ($filter) { 
    return { 
     require: '?ngModel', 
     link: function (scope, elem, attrs, ctrl) { 
      if (!ctrl) return; 


      ctrl.$formatters.unshift(function (a) { 
       return $filter(attrs.format)(ctrl.$modelValue) 
      }); 


      ctrl.$parsers.unshift(function (viewValue) { 
       var plainNumber = viewValue.replace(/[^\d|\-+|\.+]/g, ''); 
       elem.val($filter(attrs.format)(plainNumber)); 
       return plainNumber; 
      }); 
     } 
    }; 
}]); 

HTML, кажется:

<input type="text" ng-model="test" format="number" /> 

См Демо Fiddle

Надежда его помощь

+0

Именно то, что мне было нужно, спасибо! –

+0

Любые идеи, почему синтаксический анализатор позже в цепочке прерывает форматирование? – Gepsens

+0

@ Gepsens вы можете объяснить, что вы имеете в виду под парсером позже в цепочке? –

1

Малый редактирования для ответа Максима Shoustin в ниже в соответствии с ответом на этот вопрос: AngularJS formatter - how to display blank instead of zero

Единственное изменение, чтобы обеспечить вход пустым, а не ноль на удаление последний номер:

ctrl.$parsers.unshift(function (viewValue) { 
     console.log(viewValue); 
     if(viewValue){ 
      var plainNumber = viewValue.replace(/[^\d|\-+|\.+]/g, ''); 
      elem.val($filter('number')(plainNumber)); 
      return plainNumber; 
     }else{ 
      return ''; 
     } 
    }); 

http://jsfiddle.net/2n73j6rb/

+0

Если я начинаю с $ scope.test = ''; Я все равно получаю 0. Как начать с пустого поля ввода? http://jsfiddle.net/magician11/947cb12h/ – magician11

5

Этот модуль отлично работает для меня.

https://github.com/assisrafael/angular-input-masks

Пример:

<input type="text" name="field" ng-model="number" ui-number-mask> 
+2

Он выглядит хорошо, хотя он использует тот же метод, который был описан в принятом ответе. Кроме того, этого не было, когда вопрос был задан. –

+1

@Abel благодарит за это замечательное решение. –

Смежные вопросы