0

$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); 

        });
}

ただし、これは私が期待したようにイベントの発生を妨げませんでした。そのため、イベントを抑制する方法を探しています。

4

1 に答える 1

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;
        });
}
于 2016-01-15T01:13:16.640 に答える