您可以在此 jsFiddle 中对其进行测试:HERE (最好在新的 jsFiddle 上查看,请参阅本文的编辑部分)
我认为 AngularJS 中存在错误,或者至少不是预期的结果。如果我分离一个表单然后重新附加它,它的类ng-invalid
切换到ng-valid
重新附加到 DOM。即使数据无效,这也会导致启用表单的提交按钮。当然,我期待有效性状态不会切换。
我认为这是一个角度错误,但可能是一个 jquery 错误。我可以使用 jquery 检查附加表单是否有效,然后强制表单类,但它似乎不能作为有效表单工作,然后获取无效状态。这很奇怪,因为在分离之前不使用某种数据来保存状态表单,我不知道任何其他解决方法。
那么有人已经遇到过这个问题吗?有什么方法(如果可能的话使用 AngularJS 指令)来摆脱这个错误?
PS:我需要在单页 Web 应用程序中分离表单(和任何其他元素)以保持 DOM 尽可能干净。
编辑
我已经完成了一个新的 jsFiddle,它更多地说明了我的问题,在内部站点导航上分离内容:http: //jsfiddle.net/EWVwa/
更新
我来到这个临时解决方案(感谢CaioToOn)
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
});
app.directive('customValidation', function() {
return {
require: ['ngModel', '^?form'],
link: function(scope, element, attr, ctrls) {
console.log(ctrls);
var ngModelCtrl = ctrls[0],
formCtrl = ctrls[1];
ngModelCtrl.$parsers.push(function(viewValue) {
if (viewValue === 'test') {
ngModelCtrl.$setValidity('name', true);
formCtrl.$setValidity('name', true);
return viewValue;
} else {
ngModelCtrl.$setValidity('name', false);
formCtrl.$setValidity('name', false);
return undefined;
}
});
// custom event
element.bind('$append', function() {
formCtrl && formCtrl.$addControl(ngModelCtrl);
/*** TEST for to keep form's validation status ***/
formCtrl.$setValidity('name', ngModelCtrl.$valid);
//ngModelCtrl.$setValidity('name', ngModelCtrl.$valid);
console.log(formCtrl.$valid);
});
//binding on element, not scope.
element.bind('$destroy', function() {
console.log("gone haven");
});
}
};
});
这需要更多关于多输入验证的测试。完成所有测试后,我肯定会更新答案。