我有一个表单,其中我的意图是不必始终强制执行必填字段。例如,如果用户将文档保存为草稿,则可以输入尽可能少的信息,如果他们尝试发布文档,则必须输入所有必需的字段。我在控制器上使用了一个布尔值,它根据按下的按钮改变,例如
<input type="text" ng-model="field2" ng-required="enforceRequired" />
问题是当布尔值发生变化时,不会重新评估字段,因此表单将被提交,然后变为无效。请see this JSFiddle看看我的意思。如果您填写field1然后单击“发布”,它将在第一次单击时成功,然后变为无效。
如何在提交表单之前强制验证运行?
答案 0 :(得分:1)
问题是您正在enforceRequired
循环中间更改digest
的值,因此在检查输入字段的有效性之前不会重新呈现观察者(请参阅摘要here)。
如果您想绕过它,我建议使用以下方法之一:
在致电enforceRequired
或saveDraft
之前更改publish
的值。见example。
$scope.$apply()
的值后,致电enforceRequired
。见another example。
答案 1 :(得分:1)
Yarons是对的,你正在改变这个值太迟了,我的意思是在表单验证运行之后。您可以做的解决方法是,在更改required
值后,让angular执行另一个循环,然后显示警报。这可以通过$timeout
服务完成,但我必须提到改变摘要操作流程通常不是一个好习惯。很快就会变得非常混乱。
像这样更改您的发布功能(并且不要忘记注入$ timeout)
$scope.publish = function () {
$scope.enforceRequired = true;
$timeout(function () {
if ($scope.form.$valid) {
alert("Published!");
}
});
};