如何在 Angular 中抑制监视语句或摘要循环

How to suppress a watch statement or digest cycle in Angular

目前我有一个文本输入附加到一个模型,其中有一个 $scope.watch 语句观察模型。这都是用来实现一种自动完成/提前输入的功能。

<!-- HTML -->
<input type="text" ng-model="search.mySearchText">


// JS
var deregister = $scope.$watch('search.mySearchText', doSearch);

function doSearch() {
    mySearchService.executeSearch(search.mySearchText)
        .then(function(res) {
            // do something with the data
        });
}

这很好用。但是,偶尔在我的 .then 函数中我想对 search.mySearchText 进行更改。显然这会导致观察者再次被解雇,但我不想这样。

我希望做的是找到一种方法来抑制 $watch 下次发射。也许通过某种方式告诉 Angular 特定观察模型 属性 不再脏?

我尝试通过 de/re- 在适当的时间注册手表来删除 $watch,但这也没有用。

function doSearch() {
    mySearchService.executeSearch(search.mySearchText)
        .then(function(res) {
            deregister(); // shut off the watch
            search.mySearchText = 'some new string'; // manipulate the model property that I don't want to cause a search
            deregister = $scope.$watch('search.mySearchText', doSearch); 

        });
}

但是,这并没有像我预期的那样阻止事件触发,这就是为什么我现在正在寻找一种方法来抑制事件。

您可以有一个变量来确定 doSearch 是否提前退出,如下所示:

var searchActive = true;
function doSearch() {
    if (!searchActive) return;
    mySearchService.executeSearch(search.mySearchText)
        .then(function(res) {
            searchActive = false;
            // do manipulation of search.mySearchText
            searchActive = true;
        });
}