2015-11-03 15 views
8

Diyelim ki, değiştiğinde, bir isteği tetikleyecek ve bazı sonuçları gösterecek bir giriş metni alanına (daha çok Google arama alanı gibi) sahip olduğumu varsayalım. ÖrneğinAngularJS - Bir sözün iptali nasıl yapılır?

, girişteki Dog yılında

edelim türü: Şimdi

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. 

, en DO isteği sonra DOG birden tepki diyelim. Modelim, DOG yazmış olsam bile DO sonuçlarıyla sonuçlanacaktır.

Bu nedenle, karakterleri yazmaya devam edersem devam eden devam eden istekleri iptal etmenin veya iptal etmenin bir yoluna ihtiyacım var. Bu şekilde, modelim sadece son istekle değiştirildi.

Benim girdi benziyor aşağıdadır: Burada

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

olan benim searchCtrl.js: Bunun gibi

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

Bu ilişkiyi belirlemek için 'reject' veya' tamamlamak için resolve' gerek promise..either iptal edemez .. –

+1

1) ng-model-options 2'yi kullanabilmeniz için metin kutunuzdaki geri dönüşü kullanın. 2) http seçeneğinin zaman aşımı özelliğine dair bir söz verebilirsiniz. iptal edebilirsiniz (ertelenmiş nesneyi reddederek), ancak istek yine de sunucu tarafından işlenecek ve sadece müşteri düzeyinde reddedilecektir. – PSL

+0

Yazarak kısa bir duraklama oluşana kadar isteği ilk etapta göndermeyerek bu sorunu çözmek daha iyi olacaktır. İsteğin iptal edilmesi, sunucunun önceden almışsa işlemesini durdurmaz. https://docs.angularjs.org/api/ng/directive/ngModelOptions'a, geri dönme seçeneğini ayrıntılı olarak bakın. –

cevap

4

Genellikle bu vaka için insanlar ng-model-options={debounce: 100}'u kullanır.

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

zaten sen sözünü reddedebilir.

+0

Bu hile yaptı! Çok teşekkür ederim! Her isteği göndermeden önce bir gecikme gibi mi? –

+0

evet, size yardımcı olur;) rica ederim. – Errorpro

+0

@MatiasCicero, temel olarak, değer her değiştiğinde sıfırlanan bir zaman aşımıdır. Böylece, değer 100 ms için değişmezse, zamanlayıcı sona erer ve bir istek gönderilir. –

0

: $q.reject(response);

teknik olarak ne kadar yukarıda yorumcu doğru olduğuna inanıyoruz, size Aslında söz vermeyi reddediyor ve gerçekten iptal etmiyor.

+1

Bu benim son isteğimi de reddetmez miydi? Kullanıcı hala yazıyorsa, yalnızca bir isteği iptal etme mantığı ne olurdu? –

+0

Kod örneğinizi tam olarak oluşturmadan önce yanıtladım, yukarıdaki yanıtsızlık yanıtı ihtiyacınızı karşılamak için daha iyi bir yöntemdir. –

1

Bu durumda debounce tekniğini kullanmak ister misiniz?

bkz:

+0

Teşekkür ederiz! Ne '' bulanık ': 0' yapar? –

+0

Bunu dokümanlardan kopyaladım, sizin durumunuzda gerekli olmayabilir, alandan çıkarken gecikme gecikmesi olmazdı (çünkü 0'dır), eğer istenirse her olay türüne bağlı olarak geri dönüşü ince ayar yapabilirsiniz – house9

İlgili konular