У меня есть текстовый ввод, и я не хочу, чтобы пользователи использовали пробелы, и все набранное будет переведено в нижний регистр.
Я знаю, что мне не разрешено использовать фильтры на ng-модели, например.
ng-model='tags | lowercase | no_spaces'
Я посмотрел на создание своей собственной директивы, но добавлял функции $parsers
и $formatters
не обновлял ввод, а только другие элементы, которые были ng-model
на нем.
Как я могу изменить ввод того, что я сейчас набираю?
По сути, я пытаюсь создать функцию «теги», которая работает так же, как здесь, в StackOverflow.
angularjs
angularjs-filter
dom-manipulation
angularjs-ng-model
Эндрю У. К. Браун
источник
источник
Ответы:
Я бы посоветовал посмотреть стоимость модели и обновить ее при изменении: http://plnkr.co/edit/Mb0uRyIIv1eK8nTg3Qng?p=preview
Единственная интересная проблема связана с пробелами: в AngularJS 1.0.3 ng-model на входе автоматически обрезает строку, поэтому он не обнаруживает, что модель была изменена, если вы добавляете пробелы в конце или в начале (поэтому пробелы не удаляются автоматически моим код). Но в 1.1.1 есть директива ng-trim, позволяющая отключить эту функцию ( фиксацию ). Поэтому я решил использовать 1.1.1 для достижения точной функциональности, которую вы описали в своем вопросе.
источник
$watch
приводит к повторному вызову слушателя. В простых случаях (когда ваш фильтр идемпотентен) вы закончите тем, что фильтр будет выполняться дважды при каждой модификации.Я считаю, что намерение входов и
ngModel
директивы AngularJS состоит в том, что недопустимые входные данные никогда не должны попадать в модель . Модель всегда должна быть действующей. Проблема с недопустимой моделью заключается в том, что у нас могут быть наблюдатели, которые запускают и предпринимают (несоответствующие) действия на основе недопустимой модели.На мой взгляд, правильное решение здесь - подключиться к
$parsers
конвейеру и убедиться, что недопустимый ввод не попадает в модель. Я не знаю , как вы пытались приблизиться к вещи или что конкретно не работать для вас ,$parsers
но здесь это простая директива , которая решит проблему (или , по крайней мере , в моем понимании проблемы):Как только указанная выше директива объявлена, ее можно использовать так:
Как и в решении, предложенном @Valentyn Shybanov, нам нужно использовать
ng-trim
директиву, если мы хотим запретить пробелы в начале / конце ввода.Преимущество такого подхода двоякое:
источник
modelCtrl.$setViewValue(transformedInput); modelCtrl.$render();
связана с полезной ссылкой на документацию: docs.angularjs.org/api/ng.directive:ngModel.NgModelController Одним словом для «защиты» моего решения является то, что свойство области можно изменять не только из представлений и мой способ прикрыть это. Поэтому я думаю, что то, как можно изменить объем, зависит от реальной ситуации.modelCtrl
- это контроллер, требуемый директивой. (require 'ngModel'
)Решением этой проблемы может быть применение фильтров на стороне контроллера:
$scope.tags = $filter('lowercase')($scope.tags);
Не забудьте указать
$filter
как зависимость.источник
Если вы используете поле ввода только для чтения, вы можете использовать ng-value с фильтром.
например:
источник
Используйте директиву, которая добавляет в коллекции $ formatters и $ parsers, чтобы гарантировать, что преобразование выполняется в обоих направлениях.
См. Этот другой ответ для получения дополнительных сведений, включая ссылку на jsfiddle.
источник
У меня была аналогичная проблема, и я использовал
в моем обработчике я вызываю метод objectInScope для правильного изменения (грубый ввод). В контроллере я где-то инициировал, что
Я знаю, что здесь не используются какие-либо причудливые фильтры или наблюдатели ... но это просто и отлично работает. Единственным недостатком этого является то, что objectInScope отправляется в вызове обработчику ...
источник
Если вы выполняете сложную асинхронную проверку ввода, возможно, стоит абстрагироваться
ng-model
на один уровень выше как часть настраиваемого класса с его собственными методами проверки.https://plnkr.co/edit/gUnUjs0qHQwkq2vPZlpO?p=preview
HTML
код
источник
Вы можете попробовать это
источник