Angular.js - 在指令中设置ng-pattern时,未定义ngModel值

Yok*_*ksy 2 javascript angularjs angularjs-directive angularjs-scope

类似的东西可能已被回答(ng-pattern + ng-change),但所有回复都无法解决这个问题.

我有两个用于创建表单输入的imbricated指令,一个用于控制名称,标签,验证器等的父指令,以及一个用于设置模式和输入类型特定内容的子指令.

但是,在设置模式时,当ng-pattern返回false时,模型上的值将设置为undefined.

指令:

<input-wrapper ng-model="vm.customer.phone" name="phone" label="Phone number">
    <input-text type="tel"></input-text>
</input-wrapper>
Run Code Online (Sandbox Code Playgroud)

生成的HTML:

<label for="phone">Phone number:</label>
<input type="text" name="phone" 
  ng-model="value"
  ng-model-options="{ updateOn: \'blur\' }"
  ng-change="onChange()"
  ng-pattern="/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/">
Run Code Online (Sandbox Code Playgroud)

JS:

angular.module('components', [])
    .directive('inputWrapper', function() {
    return {
        restrict: 'E',
        require: 'ngModel',
        scope: true,
        link: function (scope, element, attrs, ngModel) {
          scope.name = attrs.name;
          scope.label = attrs.label;

          scope.onChange = function () {
            ngModel.$setViewValue(scope.value);
          };

          ngModel.$render = function () {
            scope.value = ngModel.$modelValue;
          };
        }
    }
    })
  .directive('inputText', function() {
    return {
        restrict: 'E',
        template: '<label for="{{name}}">{{label}}:</label><input type="text" name="{{name}}" ng-model="value" ng-model-options="{ updateOn: \'blur\' }" ng-change="onChange()" ng-pattern="pattern">',
        link: function (scope, element, attrs) {

          if (attrs.type === 'tel') {
            scope.pattern = /^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/;
          }
        }
    }
    });

angular.module('app',['components'])
        .controller('ctrl',function($scope){
          var vm = this;

          vm.customer = {
            phone: '010203040506'
          };
        });
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么 ?

用例的Codepen:https://codepen.io/Yosky/pen/yVrmvw

小智 5

默认为角度,如果验证器失败,未定义的值分配给ng-model,您可以更改此设置,如下所示:

 <div ng-model-options="{ allowInvalid: true}">
Run Code Online (Sandbox Code Playgroud)

在这里阅读详细文档