【问题标题】:Modifying AngularJS form field validation attributes asynchronously异步修改AngularJS表单字段验证属性
【发布时间】:2015-01-20 00:55:18
【问题描述】:

我的情况类似于this question。我的独特之处在于,在页面完成其初始渲染/绑定后的某个时间点,我会异步(通过 Web 服务调用)接收我的“动态”信息。所以,我的指令流程是这样的:

** 更新:在这里完成复制:http://plnkr.co/edit/TIVbhGFMAQpUaMxKp9Dc?p=info

 Markup: <input dynValidate />
 Directive:

 app.directive('dynValidate',function($compile,$parse) {
      restrict: 'A', require: 'ngModel', replace: false, terminal: true,
      link: function (scope, elem, attr, ctrl) {
        var validatorKey = elem.attr('ng-model') + 'Validation';
        var installValidators = function () {
                // ...add some ng-validation attributes     
                // (omitted for brevity, but does something like elem.attr('ng-minlength','5')
                // based on metadata in the bound model
                elem.removeAttr('dynValidate'); // Remove my own directive
                $compile(elem)(scope); // recompile to incorporate new ng directives
            }
        };
        // watch for the validation metadata to arrive asynchronously
        scope.$watch(validatorKey, function() {
            installValidators(attr, ctrl);
        });
      }
  });

这种工作:我的指令属性被一些角度验证指令替换,并且验证在此元素级别正常运行。问题是异步重新编译似乎导致父 ng-form 丢失了元素。具体来说,当输入更改时,form.fieldName.$isDirty 永远不会设置为 true。这是有道理的,因为我基本上已经删除了原始元素并将其替换为不同的元素,但我想知道是否有任何机制可以让我告诉父表单这已经发生,并且它应该连接它表单级别的 $error/$dirty 机制。

谢谢!

【问题讨论】:

    标签: angularjs angularjs-directive angularjs-validation


    【解决方案1】:

    我建议获取重新编译的&lt;input&gt;ngModel controller 并使用$addControl 将其注册到表单的ngForm controller

    【讨论】:

    • 有趣的想法,有没有办法从指令内部获取表单控制器?
    • Require it 就像您需要 ngModel 控制器(前缀名称与 ^ 以从祖先元素获取指令控制器)。
    • 啊酷,require 有效,但似乎不影响 plunkr 中的行为。
    • 在重新编译之前,您是否尝试过先$removeControl?或者可能不首先将ngModel 放在输入上,并且仅在添加其余属性时才添加它?此外,您必须获得新编译元素的ngModel 控制器,而不是使用required 的原始控制器。为此,请使用compiledElement.controller('ngModel')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2019-08-25
    • 2019-09-25
    • 2016-07-26
    相关资源
    最近更新 更多