javascript - Angular — 屏蔽输入、$parsers、$formatters 和模式验证

标签 javascript angularjs angularjs-directive

在表单上,​​我们有一个屏蔽输入,可以使用 jquery 插件通过指令进行工作。

效果很好 - 用户可以看到屏蔽的电话值(但仅在焦点之后),但我们需要未屏蔽的模型值而不是屏蔽的(例如,如果我们输入电话 (123)456-78-90 我们必须将模型设置为 1234567890,同时我们必须在我们的字段中看到 (123)456-78-90)。

好的,让我们将 ngModel.$parsers 添加到指令中。好的,效果很好——正如我们所需要的。

  .directive('phoneNumber', function() {
    return {
      restrict: 'A',
      require: 'ngModel',
      link: function($scope, element, attrs, ngModel) {

        $(element).mask('(999) 999-99-99');

        // view -> model
        ngModel.$parsers.push(function(value) {
          if (value) {
            return value.replace(/[^0-9]+/g, '');  
          }
        });

      }
    }
  });

但是当我添加验证规则时

  <input type="text" class="form-control" 
    ng-model="phone" name="phone"
    phone-number
    ng-pattern="^\d+$"
    ng-maxlength="10"
    ng-minlength="10"
    placeholder="(999)999-99-99">
  • ng-pattern="^\d+$" 我得到了有效的模式,好的,有效
  • ng-minlength="10" 我得到了有效的 minlength,好吧,这也有效
  • ng-maxlength="10" 由于 maxlength,我收到验证错误。在这种情况下,验证似乎使用 (123)456-78-90 值而不是 1234567890。

我的问题在这里:

  • 如何使用默认模型值获取屏蔽值(一开始我得到 1234567890 而不是 (123)456-78-90),只有在字段获得焦点后我才能看到屏蔽值
  • 如何使用屏蔽输入进行工作验证(ng-pattern、ng-min/maxlength)?

查看 plnkr 和我的代码示例 http://plnkr.co/edit/Kalv9N2bP27v1ENAfefb?p=preview

最佳答案

好吧,玩了一会后,我就开始工作了:

http://plnkr.co/edit/v9dvwaFzwOw4rkwhbMnM?p=preview

几件事:

  1. 按照我在评论中所说,我必须在执行 mask 之后执行 $scope.$apply
  2. 由于 jQuery 的掩码与对象的值混淆,我不得不对验证器进行不太漂亮的检查,但它有效:)。

代码:

 .directive('phoneNumber', function() {
    return {
      restrict: 'A',
      require: 'ngModel',
      link: function($scope, element, attrs, ngModel) {

        $scope.$apply();
        $(element).mask('(999) 999-99-99');


        // view -> model
        ngModel.$parsers.push(function(value) {
          if (value) {
            return value.replace(/[^0-9]+/g, '');  
          }
        });

      }
    }
  });

HTML:

<input type="text" class="form-control" 
    ng-model="phone" name="phone" phone-number >

<span class="text-danger" 
    ng-show="appForm.phone.$dirty && appForm.phone.$invalid || !phone">
    Incorrect phone value
</span>

关于javascript - Angular — 屏蔽输入、$parsers、$formatters 和模式验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30145734/

相关文章:

javascript - Angular-ui typeahead 仅在退格键上给出正确的结果

javascript - 在执行操作之前等待 2 个异步 API 调用的结果

javascript - AngularJS - 为什么我的复选框不与我的 ng-model 属性保持状态?

javascript - onbeforeunload 事件可以通过 $watch 在 angular js 中观看吗?

javascript - window.location强制更新?

javascript - 可以将常规 JavaScript 转换为 asm.js,还是仅用于加速静态类型的低级语言?

angularjs - 如何使用基于另一个元素类的 AngularJS ng-Class 条件?

javascript - token '==' 是意外的 ngClass

javascript - 如何颠倒图像顺序

javascript - jQuery 设置标志以停止提交循环