使用ng-required变量不会重新评估字段

时间:2015-01-14 10:42:40

标签: angularjs

我有一个表单,其中我的意图是不必始终强制执行必填字段。例如,如果用户将文档保存为草稿,则可以输入尽可能少的信息,如果他们尝试发布文档,则必须输入所有必需的字段。我在控制器上使用了一个布尔值,它根据按下的按钮改变,例如

<input type="text" ng-model="field2" ng-required="enforceRequired" />

问题是当布尔值发生变化时,不会重新评估字段,因此表单将被提交,然后变为无效。请see this JSFiddle看看我的意思。如果您填写field1然后单击“发布”,它将在第一次单击时成功,然后变为无效。

如何在提交表单之前强制验证运行?

2 个答案:

答案 0 :(得分:1)

问题是您正在enforceRequired循环中间更改digest的值,因此在检查输入字段的有效性之前不会重新呈现观察者(请参阅摘要here)。

如果您想绕过它,我建议使用以下方法之一:

  1. 在致电enforceRequiredsaveDraft之前更改publish的值。见example

  2. 更改$scope.$apply()的值后,
  3. 致电enforceRequired。见another example

答案 1 :(得分:1)

Yarons是对的,你正在改变这个值太迟了,我的意思是在表单验证运行之后。您可以做的解决方法是,在更改required值后,让angular执行另一个循环,然后显示警报。这可以通过$timeout服务完成,但我必须提到改变摘要操作流程通常不是一个好习惯。很快就会变得非常混乱。

像这样更改您的发布功能(并且不要忘记注入$ timeout)

$scope.publish = function () {
    $scope.enforceRequired = true;

    $timeout(function () {
        if ($scope.form.$valid) {
            alert("Published!");
        }
    });
};

工作小提琴:http://jsfiddle.net/bh9q00Le/14/