javascript - AngularJS 对动态生成的输入指令的表单验证不适用于 ngForm

标签 javascript jquery angularjs forms validation

我正在尝试验证使用指令生成的动态表单输入并隔离范围。在指令之外,我有主窗体,在 ng-repeat 内部,我尝试使用 ng-form,但它从未显示错误消息。最初我在 ng-repeat 上有 ng-form,但我认为这行不通,因为它超出了指令的范围,所以将它放在指令的父 div 上,但仍然没有显示对无效电子邮件的验证.

带有 ng-repeat 和字段指令的表单

<form name="mainForm" 
      role="form" 
      ng-controller="WizardFormController as wizFormCtrl" 
      ng-submit="submit( mainForm.$valid )"
      novalidate>

      <div ng-repeat="field in panel.form_fields">

           <form-field field="field" 
                       model="models[field.field_name]" ng-form="subForm">
           </form-field>

      </div>

      <div class="form-group clearfix">
      <button class="btn btn-primary pull-right" 
              ng-click="update( models )"
              ng-disabled="mainForm.$invalid">Save Progress</button>

      </div>

</form>

表单字段指令

<div class="form-group" ng-form="subForm">

    <label for="{{field.field_name}}">{{field.field_label}}</label>

    <input type="text"
       class="form-control"
       id="{{field.field_id}}"
       name="{{field.field_name}}"
       ng-model="model">

     <div ng-show="subForm[field.field_name].$dirty &&
              subForm[field.field_name].$invalid">Invalid:

    <span ng-show="subForm[field.field_name].$error.email">This is not a valid email.</span>
    </div>

</div>

看起来应该可以查看生成的标记,表明该字段是 ng-valid:

<div class="form-group ng-scope ng-dirty ng-valid-required ng-valid ng-valid-email" 
     ng-form="subForm">

这就是我访问子表单的方式吗:

subForm[field.field_name].$dirty

更新 我找到了解决此问题的方法并在下面进行了回答,请参阅 here

最佳答案

这个问题的解决方案显然正在开发中,并且已经存在 2 年多了。在 GitHub 上投上您的一票!可以找到最容易实现的解决方案,也可以说是最好的解决方案 here感谢Thinkscape , 我已经在下面复制了它。

  angular.module('interpol', [])

  .config(function($provide) {

    $provide.decorator('ngModelDirective', function($delegate) {
      var ngModel = $delegate[0], controller = ngModel.controller;
      ngModel.controller = ['$scope', '$element', '$attrs', '$injector', function(scope, element, attrs, $injector) {
        var $interpolate = $injector.get('$interpolate');
        attrs.$set('name', $interpolate(attrs.name || '')(scope));
        $injector.invoke(controller, this, {
          '$scope': scope,
          '$element': element,
          '$attrs': attrs
        });
      }];
      return $delegate;
    });

    $provide.decorator('formDirective', function($delegate) {
      var form = $delegate[0], controller = form.controller;
      form.controller = ['$scope', '$element', '$attrs', '$injector', function(scope, element, attrs, $injector) {
        var $interpolate = $injector.get('$interpolate');
        attrs.$set('name', $interpolate(attrs.name || attrs.ngForm || '')(scope));
        $injector.invoke(controller, this, {
          '$scope': scope,
          '$element': element,
          '$attrs': attrs
        });
      }];
      return $delegate;
    });
  })

  .run(function($rootScope) {
    $rootScope.models = [{
      value: 'foo'
    },{
      value: 'bar'
    },{
      value: 'baz'
    }];
});

我只是将其放入,并将其标记为依赖项,并且我问题中的表单有效。

干杯

关于javascript - AngularJS 对动态生成的输入指令的表单验证不适用于 ngForm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25651288/

相关文章:

c# - WebApi 2 OAuth 外部登录访问 token 问题

javascript - 在 Angular 图中显示未定义的图例

javascript - V8 分析 : linux-tick-processor not working with d8

javascript - 页面加载后的弹出窗口每 24 小时仅打开一次

jquery - 使用 jquery 在选项选择的基础上添加新的表单输入字段

javascript - 使用 .find() 或选择复选框时出现奇怪的 Jquery(移动)错误?

javascript - Backbone.js 点击事件未触发

javascript - 如何使用 meteor 创建登录系统?

jquery - 从父框架的 iframe 内的元素上触发事件处理程序

javascript - 指令内的按钮未被禁用