Como usar a ui-mask angular para mascarar um número de telefone com extensão opcional?

Temos a demonstração aqui na página angular-ui.

Pergunto - me como podemos escrever uma máscara com um número de extensão opcional.

(999) 999-9999 ext. 999 vai fazer a extensão necessária.

Author: Blaise, 2014-07-15

4 answers

Partilhei este mesmo problema contigo. Existe uma característica de caracteres opcional completamente não documentada para este componente. Só consegui encontrá-lo lendo o código fonte.

A solução para a sua máscara seria:

(999) 999-9999 ext. ?9?9?9

Os pontos de interrogação na sua máscara marcarão o próximo carácter como opcional. Acredita, funciona.

Desculpa ter demorado tanto a responder.
 21
Author: Pedro Affonso, 2015-07-02 17:05:07
(999) 999-9999 ext. ?9?9?9
Isto vai funcionar bem, mas se quiseres limpar o borrão e colocar a máscara, então precisas de mais um pouco, eu usei assim.
<input type='text'
  ng-model='customer.phone'
  ui-mask="{{phoneMask}}"
  ng-blur="removeMask()"
  ng-focus="placeMask()" />

E no meu controlador:

$scope.phoneMask= "(999) 999-9999 ext. ?9?9?9";
$scope.removeMask = function () {
   if ($scope.rep.phone.length === 10) {
        $scope.phoneMask= "(999) 999-9999";
    }
};
$scope.placeMask = function () {
  $scope.phoneMask= "(999) 999-9999 ext. ?9?9?9";
}
Espero que ajude!
 3
Author: Ali Adravi, 2016-05-03 14:58:41
Ainda não há resposta para esta depois de duas semanas. Presumo que todos concordem que este AngularUI é demasiado limitado para lidar com esta situação.

Acabei por usar jquery.inputmask (http://github.com/RobinHerbots/jquery.inputmask).

Temos usado esta biblioteca de extensão jQuery desde que não há Angular. Parece ainda a máscara de entrada mais poderosa. Pelo menos tem todas as funções de que preciso. Aqui está a minha armadilha.
  1. Em primeiro lugar, é claro é para NuGet ou descarrega a biblioteca. A versão atual (3.0.55) separa funções em diferentes arquivos js. (data, numérico, telefone...) Certifique-se de incluir tudo o que você precisa.

  2. Criar uma directiva para o atributo ou classe da máscara de entrada. Utilizar link na presente directiva para utilizar a jQuery para aplicar a máscara de entrada:

Aqui está o código:

(function(){
    'use strict';        
    var directiveId = 'myInputMask';
    angular.module('myApp')..directive(directiveId, function() {
        return {
            restrict: 'AC',
            link: function (scope, el, attrs) {
                el.inputmask(scope.$eval(attrs.myInputMask));
                el.on('change', function() {
                    scope.$eval(attrs.ngModel + "='" + el.val() + "'");
                    // or scope[attrs.ngModel] = el.val() if your expression doesn't contain dot.
                });
            }
        }
    });
})();    
  1. finalmente, aplique esta diretiva no atributo ou classe em nosso Html.

Aqui está o Html:

<input type="text" id="phone"
    my-input-mask="{mask: '(999)999-9999[ ext. 9999]', greedy: false}"
    required="" ng-model="employee.phone">

Claro., com jquery.inputmask, Podemos ter uma máscara de entrada muito mais complexa:

<input type="text" id="salary"
    dnr-input-mask="{'alias': 'numeric', 'groupSeparator': ',', 'autoGroup': true, 'digits': 2, 'digitsOptional': true, 'placeholder': '0'}"
    model="employee.salary">
Então a conclusão: AngularUI ainda tem um longo caminho a percorrer para satisfazer as nossas necessidades. Neste momento, ainda prospera.
 1
Author: Blaise, 2014-07-29 14:57:24

Uma boa solução para este problema é usar ngMask que lhe permite fazer exactamente o que quiser sem jQuery. Para fazer isso apenas adicionar um "an"?'depois do carácter que deseja ser opcional:

mask="9?9999-9999

Isso é ótimo para entradas como números de telefone brasileiros, que podem ter 8 ou 9 caracteres.
 1
Author: akz92, 2015-12-12 23:06:05