Angularjs создает маску ввода

#javascript #angularjs

#javascript #angularjs

Вопрос:

Я пытаюсь создать директиву для создания пользовательской маски для моего ввода. Я знаю, что есть другие библиотеки, которые я мог бы использовать, но иногда мне нужен пользовательский ввод, основанный на потребностях компании (например, «OS.012-08765»), поэтому я бы предпочел создать свою собственную директиву.

До сих пор мне удавалось форматировать число по нужному мне шаблону, но не на входе, а только на модели. Для этого примера я буду использовать денежный ввод, потому что с ним проще работать (я думаю). Это код, который я использую:

 function myMoney() {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function(scope, element, attr, ngModelCtrl) {
            ngModelCtrl.$formatters.push( formatInput );
            ngModelCtrl.$render = renderViewValue;
            ngModelCtrl.$parsers.push( parseOutput );


            function formatInput( value ) {
                value = formatNumber(value);
                return value;
            }
            function parseOutput( value ) {
                value = formatNumber(value);
                return value;
            }
            function renderViewValue() {
                element.html( ngModelCtrl.$viewValue );
            }

            function formatNumber(value) {
                if(!value) {
                    value = '000';
                }

                var checkValue = value.replace(/[^0-9.]/g, '');
                if(checkValue != value) {
                    value = checkValue;
                }

                value = value.toString();

                if(value.length < 3) {
                    value = ('000' value).slice(-3);
                }

                var 
                    firstChar = value.slice(0, value.length-2),
                    lastChar  = value.slice(-2),
                    firstChar = Number(firstChar).toLocaleString(),
                    finalChar = '$' firstChar ',' lastChar;

                return finalChar;
            }
        }
    }
}
  

И это plunkr с кодом: http://plnkr.co/edit/UjZkPFL0V4FRrDUL9jAJ?p=preview


Основная проблема заключается в том, где находится вывод, если вы начинаете вводить ввод, значение не имеет маски, это просто числа. Но модель имеет правильную маску.

Итак, исходя из этого, у меня есть 2 основные проблемы:

  • Во-первых: я хочу инвертировать эти результаты. Я хочу ввести текстовое поле и поместить маску в текстовое поле, в то время как модель — это просто число (без маски).
  • Во-вторых: если я создаю кнопку для обновления значения в модели, она не форматируется в маске, она остается обычным текстом.

Как я могу решить эти проблемы?

Комментарии:

1. Вы не можете использовать <input placeholder="__.___-_____ "> ? Таким образом, вам не придется беспокоиться о замене «_» вашим фактическим символом.

2. Но проблема с заполнителем заключается в том, что он не будет заполняться в соответствии с типами пользователей, чего я и хочу.

Ответ №1:

попробуйте использовать маску пользовательского интерфейса, https://htmlpreview.github.io/?https://github.com/angular-ui/ui-mask/master/demo/index.html , введите AA.999-99999 в поле Определение маски, чтобы соответствовать вашему шаблону.

 <input type="text" 
       ng-model="serviceOrderNumber" 
       ui-mask="AA.999-99999"  
       ui-mask-placeholder 
       ui-mask-placeholder-char="_"/>
  

Комментарии:

1. Как я уже сказал, я знаю, что есть библиотеки, которые я мог бы использовать, но я хочу сам разработать ir. Есть идеи, как это сделать?

2. Я понимаю… Если вы действительно хотите отслеживать свои символы-заполнители, вам нужно будет вычислить каждую позицию курсора и заменить ее своим фактическим символом. Однако мне потребуется много времени, чтобы создать маску ввода с нуля. Удачи!

3. смотрите github.com/angular-ui/ui-mask/blob/master/dist/mask.js для реализации. вы должны создать директиву, потребовать ‘ngModel’, через функцию link получить доступ к контроллеру ngModel, переписать часть его логики (функция $ isEmpty (), логика валидности …), Использовать $ formatters и $ parsers от ngModelController для изменения значений представления и модели вашего ngModel

4. @EdmarMiyake Мне на самом деле не нужно проверять, где находится курсор и т.д.. Но, например, как только пользователь начнет вводить текст, он начнет заполнять маску. Так же, как и большинство валютных масок. Вы начинаете печатать, и когда у вас есть только одно число, вывод будет «0.01», а после того, как вы введете больше, это будет «149.65»

5. @Andriy Я уже пытаюсь выполнить обратный анализ кода, но если бы вы могли разработать ответ, расширяющий объяснение вашего комментария, это было бы здорово. Кроме того, это не обязательно должна быть сложная маска. Как только я доберусь до основ, я думаю, что смогу продолжить.