如果用户单击取消,禁用'$scope.$on('$locationChangeStart')'?

disable'$scope.$on('$locationChangeStart' )' if user click cancel?

当用户单击取消时我遇到了问题,它确实会重定向我它会触发 $scope.$on('$locationChangeStart') 因为我会让 'You have unsaved changes. If you continue your changes will be lost.' 出现两次。只是想问一下,如果用户单击取消

,我该如何禁用'$scope.$on('$locationChangeStart' )'

代码

$scope.cancel = function() {
    var validator = npFormValidator($scope);
    if ($scope.npForm.$dirty) {
        var answer = confirm('You have unsaved changes.  If you continue your changes will be lost.');
        if (answer) {
            $location.path('/home');
        } else {
            validator.addWatches();
            event.preventDefault();

        }
    }
};


$scope.$on('$locationChangeStart', function (event) {
    var validator = npFormValidator($scope);
    if (validator.valid() && $scope.model.clickedSave) {
        window.onbeforeunload = undefined;
    } else {
        if ($scope.npForm.$dirty) {
        var answer = confirm('You have unsaved changes.  If you continue your changes will be lost.');
            if (!answer) {
                validator.addWatches();
                event.preventDefault();
            }
        }
    }
})

;

您可以设置一个标志并在您的事件接收器中检查它:

var canceled = false;
$scope.cancel = function() {
    var validator = npFormValidator($scope);
    if ($scope.npForm.$dirty) {
        var answer = confirm('You have unsaved changes.  If you continue your changes will be lost.');
        if (answer) {
            canceled = true;
            $location.path('/home');
        } else {
            canceled = false;
            validator.addWatches();
            event.preventDefault();

        }
    }
};

$scope.$on('$locationChangeStart', function (event) {
    if (canceled) return;
    var validator = npFormValidator($scope);
    if (validator.valid() && $scope.model.clickedSave) {
        window.onbeforeunload = undefined;
    } else {
        if ($scope.npForm.$dirty) {
        var answer = confirm('You have unsaved changes.  If you continue your changes will be lost.');
            if (!answer) {
                validator.addWatches();
                event.preventDefault();
            }
        }
    }
});