AngularJS и AngularUI: маскируйте или форматируйте номер телефона при привязке

Я использую AngularUI для форматирования или «маскировки» ввода номера телефона, и он отлично работает с ng-моделью:

<input ng-model="emer.phone" ui-mask="{{'(999) 999-9999'}}" type="text"/>

Вопрос: Но как мне теперь применить ту же маску таким же образом с помощью ng-bind, у меня что-то вроде этого:

<td>{{emer.phone}}</td>

Моя проблема: ng-model и ng-bind находятся в двух разных файлах в разных местах, поэтому использование «$ viewValue» для меня не вариант.

Есть идеи?

некоторая документация по маске AngularUI: http://angular-ui.github.io/ui-utils/

Спасибо!


person lito    schedule 19.11.2013    source источник


Ответы (5)


Вы должны использовать ui-mask="(999) 999-9999" вместо ui-mask="{{'(999) 999-9999'}}".

Последний пытается привязаться к модели с '(999) 999-9999' на ней.

person Tom Tavernier    schedule 29.07.2014

До сих пор я не мог найти простого решения с использованием маски AngularUI, поэтому мне пришлось создать фильтр. Я следую этому: Форматировать номера телефонов и кредитных карт в AngularJS

А вот jsfiddle: http://jsfiddle.net/jorgecas99/S7aSj/

angular.module('ng').filter('tel', function () {
    return function (tel) {
        if (!tel) { return ''; }

        var value = tel.toString().trim().replace(/^\+/, '');
        ...

Ваше здоровье!

person lito    schedule 20.11.2013

Вместо создания собственной маскировки или, возможно, создания собственной директивы, вы можете использовать существующие решения.

Возьмем, к примеру, tel.js. Это директива input[tel], которая форматирует и проверяет международные телефонные номера.

Вы можете установить его из Bower следующим образом:

bower install teljs --save

Затем:

  1. Свяжите два файла сценария, найденные в папке src: tel.js и metadatalite.js.

    <script src="bower_components/teljs/src/tel.js"></script>
    <script src="bower_components/teljs/src/metadatalite.js"></script>
    
  2. Загрузите модуль tel.js.

    angular.module('<your module>', ['teljs']);
    

Вы можете попробовать tel.js здесь:

http://michaelkrog.github.io/tel.js/

Примечание: я разработчик tel.js.

person Michael Krog    schedule 16.09.2014

Я вижу в ui-mask демо, они немного жульничают и используют $viewValue из ngModelController.

Итак, вы можете попробовать то же самое.

Во-первых, вы должны добавить имя в поле ввода и завернуть в форму (с именем):

<form name="demo">
    <input name="emerPhone" ng-model="emer.phone" ui-mask="{{'(999) 999-9999'}}" type="text"/>
    <td>{{demo.emerPhone.$viewValue}}</td>
</form>

Как видно из приведенного выше примера, код отображения становится таким:

<td>{{demo.emerPhone.$viewValue}}</td>

Хотя было бы лучше, если бы они также предоставили фильтр.

Кроме того, я вижу, что в демо для маски пользовательского интерфейса они отображаются и скрываются в зависимости от length из $viewValue:

<div ng-show="demo.masked.$viewValue.length">NgModelController.$viewValue: <code>{{ demo.masked.$viewValue
              }}</code></div>
            <div ng-hide="demo.masked.$viewValue.length">NgModelController.$viewValue: <code>undefined</code></div>

Надеюсь это поможет.

person Davin Tryon    schedule 19.11.2013
comment
Привет @Davin, спасибо за ваш комментарий :)... к сожалению, я могу использовать его таким образом, потому что моя ng-модель и ng-bind находятся в двух разных представлениях и разных файлах, поэтому идентификатор $viewValue недоступен :(. Id есть ли другой вариант для меня? - person lito; 20.11.2013
comment
С ui-mask другого варианта, похоже, нет. Возможно, вам придется написать свой собственный фильтр. - person Davin Tryon; 20.11.2013
comment
опечатка: к сожалению, я не могу* использовать - person lito; 20.11.2013

Найдите Plunker для форматирования номеров кредитных карт с помощью директивы angularjs. Формат номеров карт в формате xxxxxxxxxxxx3456 Fromat.

    angular.module('myApp', [])

   .directive('maskInput', function() {
    return {
            require: "ngModel",
            restrict: "AE",
            scope: {
                ngModel: '=',
             },
            link: function(scope, elem, attrs) {
                var orig = scope.ngModel;
                var edited = orig;
                scope.ngModel = edited.slice(4).replace(/\d/g, 'x') + edited.slice(-4);

                elem.bind("blur", function() {
                    var temp;
                    orig  = elem.val();
                    temp = elem.val();
                    elem.val(temp.slice(4).replace(/\d/g, 'x') + temp.slice(-4));
                });

                elem.bind("focus", function() {
                    elem.val(orig);
               });  
            }
       };
   })
  .controller('myCtrl', ['$scope', '$interval', function($scope, $interval) {
    $scope.creditCardNumber = "1234567890123456";
  }]);
person Sagar Bhosale    schedule 23.09.2016