使用intl-tel-input lib的Angular电话号码指令

时间:2014-07-15 08:53:22

标签: angularjs directive

我目前正在尝试创建一个自定义指令,该指令将使用以下lib初始化输入:intl-tel-input

所以我用bower下载了所需的.js文件:

<script src="bower_components/intl-tel-input/build/js/intlTelInput.min.js"></script>

然后我创建我的输入:

input type="tel" class="form-control" id="tel" name="tel" ng-model="informations.tel" ng-keyup="checkPhoneFormat()" ng-click="checkPhoneFormat()">

我正在我的控制器开头初始化它:

angular.element('#tel).intlTelInput({
    validationScript: "../../bower_components/intl-tel-input/lib/libphonenumber/build/isValidNumber.js",
    preferredCountries: ['en', 'fr']
});

我的问题是,当我尝试访问informations.tel模型时,它总是未定义的。似乎输入不会动态更新模型值。

所以我必须写这样的东西来将输入字段的实际值与我未更新的模型值绑定:

    $scope.checkPhoneFormat = function(){
        $scope.informations.telephone = angular.element('#telephone').val();
        ...}

可能没问题,但我想创建一个自定义指令来初始化这些输入,例如:

app.directive('phoneInput', function (PhoneFactory) {
    return {
        require: 'ngModel',
        restrict: 'A',
        scope: {
            phoneNumber: '='
        },
        link: function (scope, element, attrs, ctrl) {
            element.intlTelInput({
                 validationScript: "../../bower_components/intl-tel-input/lib/libphonenumber/build/isValidNumber.js",
                 preferredCountries: ['en', 'fr']
            });

            ctrl.$parsers.unshift(function(viewValue) {
                console.log(viewValue);
            });
        }
    };
});

但是由于未定义ngModel,从未达到初始化函数......您是否知道如何解决我的问题?

4 个答案:

答案 0 :(得分:12)

您是对的,模型不会自动更新。 你可以像这样做一个指令

app.directive('intlTel', function(){
  return{
    replace:true,
    restrict: 'E',
    require: 'ngModel',
    template: '<input type="text" placeholder="e.g. +1 702 123 4567">',
    link: function(scope,element,attrs,ngModel){
      var read = function() {
        var inputValue = element.val();
        ngModel.$setViewValue(inputValue);
      }      
      element.intlTelInput({
        defaultCountry:'fr',
      });
      element.on('focus blur keyup change', function() {
          scope.$apply(read);
      });
      read();
    }
  }
});

可以这样调用

<intl-tel ng-model="model.telnr"></intl-tel>

这是Plunker

答案 1 :(得分:4)

有一项名为international-phone-number @ https://github.com/mareczek/international-phone-number

的新指令

请结账,欢迎任何贡献

答案 2 :(得分:4)

我们中的一些人使用了Marks的指令,但是缺少测试和jquery在头部所需的位置导致了问题,因此创建了ng-intl-tel-input

https://github.com/hodgepodgers/ng-intl-tel-input

检查它,它的单位和功能测试器的功能测试 在这里玩它:

http://hodgepodgers.github.io/ng-intl-tel-input/

答案 3 :(得分:2)

马克的指令为我工作: https://github.com/mareczek/international-phone-number

使用intl-tel-input(至少使用v3.6)的一个问题是,除非你有一个加号(&#39; +& #39;)之前。这会为我的用户带来时髦的行为。我将我的电话号码标准化(没有加号)在我的数据库中,所以我需要一个黑客来解决这个问题。我没有在服务器上格式化,而是选择格式化前端的电话号码。我在Mark的指令中添加了以下内容以获取我需要的行为:

var makeSureInitialValueStartsWithPlusSign = function() {
  var clear_watcher = scope.$watch(attrs.ngModel, function(changes) {
    elem_val = element.val();
    if (elem_val && elem_val[0] != "+") {
      element.val("+" + changes);
      clear_watcher();
    }
  });
};
makeSureInitialValueStartsWithPlusSign();

谢谢Mark

*正确地说,我的意思是转换&#39; 19734566789&#39;到&#39; +1 973-456-6789&#39;。 int-tel-input转换&#39; 19734566789&#39;至&#39; 1 973-456-6789&#39; (没有脓)。当用户去编辑它时,他们会遇到不良行为,因为加号不存在。