删除$watch并在AngularJS中将$watch的逻辑带出
我有一个AngularJS代码,如下所示:删除$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
$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,我根据你的建议进行了更改,我能够做到这一点。