Я хотел бы создать директиву для элемента управления ввода, который форматирует число с X числом десятичных знаков, когда вход не имеет фокуса. Когда вход имеет фокус, я хотел бы, чтобы число отображалось неформатированным (без запятых).Угловая директива фильтра формата number для ввода с использованием NgModel
Я почти там, со следующим кодом. Когда вы нажимаете внутри ввода, текст изменяется, и когда вы нажимаете (размываете событие), текстовые форматы снова. Однако, если я изменяю значение на входе, то события, похоже, меняются вокруг, а событие размытия ничего не делает. Затем, если вы снова щелкните в поле ввода, значение будет форматироваться, когда оно не должно, а событие размытия будет изменяться, когда оно должно форматироваться.
Чтобы использовать директиву, вы можете просто сделать
<input number-format ng-model="myValue" decimals="numberOfDecimals" />
Вот директива
App.directive('numberFormat', ['$filter', '$parse', function ($filter, $parse) {
return {
require: 'ngModel',
link: function (scope, element, attrs, ngModelController) {
var decimals = $parse(attrs.decimals)(scope);
ngModelController.$parsers.push(function (data) {
//convert data from view format to model format
return $filter('number')(data, decimals); //converted
});
ngModelController.$formatters.push(function (data) {
//convert data from model format to view format
return $filter('number')(data, decimals); //converted
});
element.bind('focus', function() {
element.val(ngModelController.$modelValue);
});
element.bind('blur', function() {
element.val(ngModelController.$viewValue);
});
}
}
}]);
С тем, как вы определили '$ parsers', директива будет хранить форматированный номера в модели (то есть, если вы ввели' 123456', '$ modelValue' будет установлена как' 123,456', который заканчивается как строка) каждый раз, когда вы редактируете соответствующее поле ввода. Вместо использования '$ parsers' и' $ formatters', почему бы не рассматривать '$ watch()' вместо значения модели? – miqid
Я не уверен, что добавление наблюдателя - лучшая идея. Мне не нравится мысль о дополнительном наблюдателе для каждого экземпляра директивы. У меня могло быть возможно 50 из них на экране. 50 дополнительных наблюдателей звучат не очень хорошо. Должно быть в состоянии сделать это без наблюдателя. – Gillardo
Ну, если вы настаиваете, вот незначительные изменения, которые должны сделать трюк. Вы ничего не говорите о проверке модели, поэтому я предполагаю, что вы в порядке с этим, http://plnkr.co/edit/wSflQs9bXYvihL5jUrvc?p=preview – miqid