2015-11-03 13 views
8

मान लीजिए कि मेरे पास एक इनपुट टेक्स्ट फ़ील्ड है (Google खोज फ़ील्ड की तरह), जो बदलते समय, अनुरोध को ट्रिगर करेगा और कुछ परिणाम दिखाएगा।कोणीयजेएस - एक वादा कैसे रद्द करें?

उदाहरण के लिए, इनपुट में 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 एक से प्रतिक्रिया करता हैं। मेरा मॉडल DO परिणामों के साथ समाप्त होगा, भले ही मैंने DOG टाइप किया हो।

इसके लिए, यदि मैं अक्षर टाइप करना जारी रखता हूं तो मुझे मौजूदा चालू अनुरोधों को रद्द या निरस्त करने का एक तरीका चाहिए। इस तरह, मेरा मॉडल केवल अंतिम अनुरोध द्वारा बदला जाता है।

मेरे इनपुट की तरह लग रहा है:

<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

हम promise..either हम करने के लिए 'reject' या' यह पूरा करने के लिए यह resolve' जरूरत रद्द नहीं कर सकते .. –

+1

1) अपने टेक्स्टबॉक्स में डिबॉन्स का उपयोग करें आप एनजी-मॉडल-विकल्प का उपयोग कर सकते हैं 2) आप http विकल्प की टाइमआउट संपत्ति का वादा कर सकते हैं आप इसे रद्द कर सकते हैं (उस स्थगित वस्तु को अस्वीकार कर), लेकिन अनुरोध अभी भी सर्वर द्वारा संसाधित किया जाएगा, इसे क्लाइंट स्तर पर खारिज कर दिया जाएगा। – PSL

+0

टाइपिंग में एक छोटा विराम होने तक अनुरोध को पहले स्थान पर नहीं भेजकर इसे हल करना बेहतर होगा। अनुरोध को रद्द करने से सर्वर को इसे संसाधित करने से नहीं रोका जाएगा यदि इसे पहले ही प्राप्त हो चुका है। https://docs.angularjs.org/api/ng/directive/ngModelOptions specfically debounce विकल्प में देखें। –

उत्तर

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

धन्यवाद! 'धुंध' क्या होता है: 0' क्या करते हैं? –

+0

मैंने दस्तावेज़ों की प्रतिलिपि बनाई है, आपके मामले में इसकी आवश्यकता नहीं हो सकती है, जब फ़ील्ड छोड़ते हैं तो इसमें देरी विलंब (क्योंकि यह 0 है) नहीं होगा, तो आप वांछित होने पर प्रत्येक ईवेंट प्रकार के आधार पर बहस को ठीक कर सकते हैं – house9

संबंधित मुद्दे