2015-11-03 15 views
8

私は入力テキストフィールド(Googleの検索フィールドによく似ています)を持っていて、変更されたときにリクエストをトリガーして結果を表示するとします。例えばAngularJS - 約束をキャンセルするには?

、入力中Dog

レッツ・タイプ:今

typed D -> Calls ctrl.search('D') -> Makes a request -> Changes model when success 
typed DO -> Calls ctrl.search('DO') -> Makes a request -> Changes model when success 
typed DOG -> Calls ctrl.search('DOG') -> Makes a request -> Changes model when success. 

、の DO要求は後で DOG 1よりも応答することとしましょう。 DOGと入力しても、私のモデルは DOの結果になります。

これは、文字を入力し続けると現在の進行中のリクエストをキャンセルまたは中止する方法が必要です。そうすれば、私のモデルは最終的な要求によってのみ変更されます。

私の入力は、次のようになります。ここでは

<input type="text" class="form-control" data-ng-model="query" data-ng-change="ctrl.search(query)" placeholder="Search" /> 

は私のsearchCtrl.js次のとおりです。

var search; 
var language; 
var _this; 

var SearchCtrl = function (searchService, lang) 
{ 
    search = searchService; 
    langauge = lang; 
    _this = this; 
} 

SearchCtrl.prototype.search = function (text) 
{ 
    var promise = search.language(language) 
        .facet('characters') 
        .highlight('quotes') 
        .query(text); 

    promise.then(function (response) { 
     if(!response) return; 
     _this.total = response.total; 
     _this.count = response.found; 
     _this.result = response.data; 
    }); 
} 
+0

我々は 'reject'または'それを完了するためにそれをresolve'する必要がありpromise..eitherをキャンセルすることはできません.. –

+1

1)あなたのテキストボックスにdebounceを使用すると、ng-model-optionsを使うことができます。2)httpオプションのtimeoutプロパティに約束することができます。 (遅延オブジェクトを拒否することによって)キャンセルすることができますが、要求は依然としてサーバーによって処理され、クライアントレベルで拒否されます。 – PSL

+0

タイピングの一時停止が発生するまで、最初にリクエストを送信しないことでこれを解決する方がよいでしょう。要求をキャンセルしても、サーバーはすでに要求を受信して​​いれば、サーバーの処理を停止しません。 debounceオプションをhttps://docs.angularjs.org/api/ng/directive/ngModelOptions specficallyに見てください。 –

答えて

4

通常この場合、人々はng-model-options={debounce: 100}を使用します。

https://docs.angularjs.org/api/ng/directive/ngModelOptions

とにかくあなたが約束を拒否することができます。

+0

これはトリックでした!どうもありがとうございました!これは、各リクエストを送信する前の遅延のようなものですか? –

+0

はい、それはあなたを助けます;)歓迎です。 – Errorpro

+0

@MatiasCicero基本的にタイムアウトで、値が変更されるたびにリセットされます。したがって、値が100ms変化しなくなると、タイマーは終了し、要求が送信されます。 –

0

このように:$q.reject(response);

技術的に私は上記のコメンターが正しいと信じていますが、実際に約束を拒否し、それを取り消すことはありません。

+1

私の最終依頼も拒否されませんか?ユーザーがまだ入力している場合は、リクエストのみを中止するロジックは何でしょうか? –

+0

コード例を完全に引用する前に私は答えました。上記のデバウンスの答えは、あなたの必要性に対処するためのより良い方法です。 –

1

この場合、debounce技術を使用したいと思いますか?

参照:

+0

ありがとうございました! '' blur ':0'は何をするのですか? –

+0

私はそれをドキュメントからコピーしましたが、あなたのケースでは必要ないかもしれませんが、フィールドを離れるときにはデバウンスの遅延がないので(0なので)、必要に応じて各イベントタイプに基づいてデバウンスを微調整できます – house9