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

lig*_*lex 6 directive angularjs

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

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

<script src="bower_components/intl-tel-input/build/js/intlTelInput.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

然后我创建我的输入:

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

我正在我的控制器的开头初始化它,如下所示:

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

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

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

    $scope.checkPhoneFormat = function(){
        $scope.informations.telephone = angular.element('#telephone').val();
        ...}
Run Code Online (Sandbox Code Playgroud)

它可以,但我想创建一个自定义指令来初始化这样的输入,如:

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);
            });
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

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

Edm*_*son 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();
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

可以像这样调用

<intl-tel ng-model="model.telnr"></intl-tel>
Run Code Online (Sandbox Code Playgroud)

这是一个Plunker