删除$watch并在AngularJS中将$watch的逻辑带出

删除$watch并在AngularJS中将$watch的逻辑带出,angularjs,angularjs-watch,Angularjs,Angularjs Watch,我有一个AngularJS代码,如下所示: $scope.startWatching = function () { return $scope.$watch('form', function (n, o) { var timeoutPromise; $timeout.cancel(timeoutPromise); //does nothing, if timeout alrdy done timeoutPromise = $timeo

我有一个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()会被多次调用number if,因此我需要将这两个方法从$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
以启用指定的操作。

如果您详细描述您正试图实现的目标,可能会有所帮助。不知道这一点就很难提出替代方案。请告诉我你还想要什么,我可以编辑这个问题。我想删除这个$watch函数,并去掉它里面的逻辑,具体来说,你想触发它的表单发生了什么变化?您可能应该在表单本身上使用
ng change
指令,而不是
$watch()
。由于控件动态显示在表单中的div中,因此已将手表放置在表单上。因此,您认为ng更改会起作用吗?在
$watch
中有
$timeout
的必要性是什么?这听起来有点毫无意义,除非我失踪了something@AlonEitan如果不知道有什么变化,
$scope.form
以及
$scope.showCompleteButton*
函数的作用,很难说出函数的作用,如示例中所述,每次调用
$scope.startWatching
函数时,代码都会添加一个额外的观察者。这个答案说明了如何避免添加额外的观察者。谢谢@georgeawg,我根据你的建议进行了更改,我能够做到这一点。