Javascript 即使在$scope中调用$setPristine()后,$dirty属性也会恢复为true

Javascript 即使在$scope中调用$setPristine()后,$dirty属性也会恢复为true,javascript,angularjs,forms,Javascript,Angularjs,Forms,我被一些听起来可能是JS异步问题的东西卡住了。我正在开发一个AngularJS应用程序,当用户键入任何表单数据但移动到另一个页面而不保存时,该应用程序能够在重定向到下一个页面之前询问用户是否要保存它。 但是,当保存成功完成时,应用程序仍然会再次询问用户是否要保存它(bug),因为条件语句 if($scope[attrs["name"]].$dirty) 即使在我在save()函数中调用$setPristine之后也是如此 这是我的指示: app.directive('formConfirmat

我被一些听起来可能是JS异步问题的东西卡住了。我正在开发一个AngularJS应用程序,当用户键入任何表单数据但移动到另一个页面而不保存时,该应用程序能够在重定向到下一个页面之前询问用户是否要保存它。 但是,当保存成功完成时,应用程序仍然会再次询问用户是否要保存它(bug),因为条件语句

if($scope[attrs["name"]].$dirty)
即使在我在save()函数中调用$setPristine之后也是如此

这是我的指示:

app.directive('formConfirmation', function($modal){

    return function($scope, attrs){
       $scope.$on('$locationChangeStart', function(event, next, current){
            if($scope[attrs["name"]].$dirty){ // the problem happens right here
                /* open modal for confirmation */
                /* and checks whether the user wants to save the dirty form */
                modalInstance.result.then(function(answer){
                    if(answer){
                        $scope.save();
                    }
                });
            }
      });
   }
});
我的控制器的保存功能如下:

$scope.save = function(){
   /* calling a service from a factory to save the record... */
   utils.save($scope.record, function(data){
       // saving was successfully completed
       $scope.myForm.$setPristine(); // $dirty value is set to false
       $location.path('/main');
   }, function(dataError){
       // saving has failed
   });
}
和我的HTML:

<form name="myForm" ng-controller="myCtrl" form-confirmation>
   <!-- Form fields here -->
</form>

当我在save函数中更改路径位置,再次触发$locationChangeStart事件时,可能会出现问题。但是,当我第二次检查表单的$dirty属性时,即使在save()函数中调用$setPristine,它的值也会恢复为true


我不确定发生了什么,我正在学习js和angularJS,但这种异步javascript架构总是一个挑战。任何帮助或指导都将不胜感激。

请查看ngModel上的dirty,而不是元素上的属性。formConfirmation-请展示您如何在Markup中使用它。我可以问一下您为什么要这样做吗?@ValeryKozlov我刚刚将它添加到我的问题中。我想,这些字段是不必要的,一旦它们是一堆带有指令ng模型的
标记。@DanPantry想象一下,如果用户填写一些详细信息,然后不小心单击我的SPA的另一个链接,他/她将丢失他/她输入的所有数据。