Angularjs 为ng required使用变量并不';不要重新评估字段

Angularjs 为ng required使用变量并不';不要重新评估字段,angularjs,Angularjs,我有一个表单,其中我的意图是不总是强制执行必填字段。例如,如果用户将文档保存为草稿,他们可以输入任意少的信息,如果他们尝试发布文档,则必须输入所有必需的字段。我在控制器上使用一个布尔值,它根据按下的按钮而变化,例如 <input type="text" ng-model="field2" ng-required="enforceRequired" /> 问题是,当布尔值更改时,字段不会重新计算,因此表单会被提交,然后变得无效。请理解我的意思。如果您填写字段1,然后单击“发布”,

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

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

问题是,当布尔值更改时,字段不会重新计算,因此表单会被提交,然后变得无效。请理解我的意思。如果您填写字段1,然后单击“发布”,则第一次单击将成功,然后变为无效


如何在提交表单之前强制验证?< /P> < P>问题是,在代码<文摘> /COD>循环中,您正在更改<代码> EngRealEuth< <代码>,因此在检查输入字段的有效性之前(请阅读摘要),请不要重新查看监视器。 如果您想避开它,我建议您使用以下方法之一:

  • 在调用
    saveDraft
    publish
    之前,更改
    enforceRequired
    的值。看

  • 更改
    enforceRequired
    的值后,调用
    $scope.$apply()
    。看


  • Yarons是对的,您更改值太晚了,我指的是在表单验证运行之后。作为一种解决方法,您可以在更改
    所需的
    值后,让angular执行另一个循环,然后显示您的警报。这可以通过
    $timeout
    服务来实现,尽管我必须指出,改变摘要操作的流程通常不是一个好的做法。很快就会变得一团糟

    像这样更改发布函数(不要忘记注入$timeout)


    工作小提琴:

    $scope.$apply()是我的最佳解决方案。非常感谢。我实际上刚刚注意到这会导致控制台中出现错误(错误:$apply已在进行中)。有办法吗?我想没有办法。您可以使用,但它会导致整个解决方案不起作用。。。这就是我提出另一种方法的原因。我最终使用了这个解决方案。谢谢这是我能找到的最好的解决办法。谢谢
    $scope.publish = function () {
        $scope.enforceRequired = true;
    
        $timeout(function () {
            if ($scope.form.$valid) {
                alert("Published!");
            }
        });
    };