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

时间:2016-09-12 16:20:57

标签: javascript angularjs forms

我被困在可能听起来像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架构总是一个挑战。任何帮助或指导将不胜感激。

0 个答案:

没有答案