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

时间:2016-01-15 00:49:33

标签: javascript angularjs angular-digest

目前,我有一个文本输入附加到模型,其中$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,那个特定的模型属性不再是脏的?

我尝试通过在适当的时间取消注册手表来移除$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); 

        });
}

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

1 个答案:

答案 0 :(得分:1)

您可以使用一个变量来确定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;
        });
}