我有类似这个问题的情况。我的独特之处在于,在页面完成其初始渲染/绑定后的某个时间点,我会异步(通过 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 机制。
谢谢!