删除 $watch 并将逻辑从 AngularJS 中的 $watch 中取出

Remove $watch and bring the logic out of the $watch in AngularJS

我在 AngularJS 中有一个代码,如下所示:

$scope.startWatching = function () {
    return $scope.$watch('form', function (n, o) {
        var timeoutPromise;

        $timeout.cancel(timeoutPromise);  //does nothing, if timeout alrdy done
        timeoutPromise = $timeout(function () {
            if (n !== o) {
                if ($scope.isLegacy) {
                    $scope.showCompleteBtn = $scope.showCompleteButton2();
                } else {
                    $scope.showCompleteBtn = $scope.showCompleteButton();
                }
            }
        }, 400);



    }, true);

因此,每当表单更改时,要么调用 $scope.showCompleteButton2() 要么调用 $scope.showCompleteButton()。

问题是 $watch() 被调用了很多次,所以我需要将这两个方法从 $watch() 中取出。

像事件侦听器这样的观察器只应在构建 DOM 时添加一次。并在 DOM 被拆除时移除。

如果代码需要启用或禁用观察者执行的操作,请在模型中提供一个状态来执行此操作:

var enableWatch = false;

$scope.startWatching = function () {
    enableWatch = true;
};

var timeoutPromise;

$scope.$watch('form', function (n, o) {
    if (!enableWatch) return;

    //ELSE
    timeoutPromise && $timeout.cancel(timeoutPromise);
    timeoutPromise = $timeout(function () {
        if (n !== o) {
            if ($scope.isLegacy) {
                $scope.showCompleteBtn = $scope.showCompleteButton2();
            } else {
                $scope.showCompleteBtn = $scope.showCompleteButton();
            }
        }
    }, 400);

}, true);

观察者在 enableWatch 变量为 false 时忽略更改。将变量设置为 true 以启用指定的操作。