2014-11-21 60 views
0

我遇到类似于this question的情况。我的独特之处在于,在页面完成其初始渲染/绑定后的某个点,我通过异步方式(通过web服务调用)接收到我的“动态”信息。所以,我的指令的流程是这样的:异步修改AngularJS表单字段验证属性

**更新:完成摄制这里: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.fieldName。$ isDirty永远不会被设置为true。这是有道理的,因为我已经基本上删除了原来的元素,并用一个不同的元素替换它,但是我想知道是否有任何机制可以让我告诉父级表单发生了这种情况,并且它应该挂钩它表单级别的$ error/$ dirty机制。

谢谢!

回答

0

我建议获得重编<input>并使用$addControl注册与表格的ngForm controller

+0

有趣的想法,有没有办法从指令内部获取窗体控制器? – jlew 2014-11-24 19:02:06

+0

[需要它](https://docs.angularjs.org/api/ng/service/$compile)就像你需要'ngModel'控制器(前缀名用'^'从祖先元素获得指令控制器)。 – hon2a 2014-11-24 20:04:28

+0

很酷,需求工作,但它似乎并没有影响普朗克的行为。 – jlew 2014-11-24 20:11:41