javascript
  • angular
  • typescript
  • rxjs
  • rxjs5
  • 2017-01-30 3 views 14 likes 
    14

    के साथ angular2 में इनपुट कीप ईवेंट पर डिबॉन्स सेवा कैसे प्राप्त करें मैं इनपुट कुंजी-अप ईवेंट पर किसी सेवा पर कॉल करने का प्रयास कर रहा हूं।ruxjs

    एचटीएमएल

    <input placeholder="enter name" (keyup)='onKeyUp($event)'> 
    

    नीचे onKeyUp() समारोह

    onKeyUp(event) { 
        let observable = Observable.fromEvent(event.target, 'keyup') 
         .map(value => event.target.value) 
         .debounceTime(1000) 
         .distinctUntilChanged() 
         .flatMap((search) => { 
          // call the service 
         }); 
        observable.subscribe((data) => { 
         // data 
        }); 
    } 
    

    यह ब्राउज़र है कि, यह हर कुंजी-अप पर कुंजी-अप समारोह बुला रहा है के नेटवर्क टैब से पाया गया है घटना (जैसा कि यह करना है), लेकिन जो मैं हासिल करने की कोशिश कर रहा हूं वह प्रत्येक सेवा कॉल के बीच 1sec का डिबॉन्स टाइम है। साथ ही, अगर मैं तीर कुंजी चाल को स्थानांतरित करता हूं तो ईवेंट ट्रिगर होता है।

    plunkr link

    +0

    RxJS संस्करण का उल्लेख करें, क्योंकि संस्करणों 4 और 5 मतभेदों के समूह है – DDRamone

    +0

    यह जरूरी

    वहाँ इसे सही ढंग से करने के लिए स्पष्ट रूप से और अधिक तरीकों, उदाहरण के लिए कर रहे हैं आरएक्सजेएस 5 बनें क्योंकि वह कोणीय 2 का उपयोग कर रहा है। – martin

    +1

    अब आपके पास क्या सही है, इसलिए आप नहीं जानते कि सेवा को कैसे कॉल करें या क्या? – martin

    उत्तर

    24

    तो श्रृंखला वास्तव में सही है, लेकिन समस्या यह है कि आप प्रत्यक्ष बना रहे हैं और हर keyup घटना पर यह की सदस्यता है। यही कारण है कि यह एक ही मूल्य कई बार प्रिंट करता है। बस कई सब्सक्रिप्शन हैं जो आप नहीं करना चाहते हैं।

    @Component({ 
        selector: 'my-app', 
        template: ` 
        <div> 
         <input type="text" (keyup)='keyUp.next($event)'> 
        </div> 
        `, 
    }) 
    export class App { 
        name:string; 
    
        public keyUp = new Subject<string>(); 
    
        constructor() { 
        const subscription = this.keyUp 
         .map(event => event.target.value) 
         .debounceTime(1000) 
         .distinctUntilChanged() 
         .flatMap(search => Observable.of(search).delay(500)) 
         .subscribe(console.log); 
        } 
    } 
    

    अपने अद्यतन डेमो देखें: http://plnkr.co/edit/mAMlgycTcvrYf7509DOP

    +1

    यह काम करता है, लेकिन थोड़ा भ्रामक है। keyUp विषय प्रकार का कोई नहीं है। यदि आप विषय चाहते हैं तो आपको इनपुट '(keyup) =' keyUp.next ($ event.target.value) 'में निर्दिष्ट करना होगा। –

    0

    ठीक है, यहाँ एक बुनियादी debouncer है।

    ngOnInit () { 
         let inputBox = this.myInput.nativeElement; 
         let displayDiv = this.myDisplay.nativeElement; 
    
         let source = Rx.Observable.fromEvent (inputBox, 'keyup') 
          .map ((x) => { return x.currentTarget.value; }) 
          .debounce ((x) => { return Rx.Observable.timer (1000); }); 
    
         source.subscribe (
          (x) => { displayDiv.innerText = x; }, 
          (err) => { console.error ('Error: %s', err) }, 
          () => {}); 
        } 
    } 
    

    आप दो संकेत दिया दृश्य बच्चों (इनपुट और प्रदर्शन) की स्थापना, तो आप debounce काम देखेंगे। सुनिश्चित नहीं है कि यह आपके द्वारा कुछ भी नहीं करता है, लेकिन यह मूल रूप (जहां तक ​​मुझे पता है) बहस करने का सीधा तरीका है, मैं इस शुरुआती बिंदु का उपयोग थोड़ा सा करता हूं, आंतरिक पाठ का सेट सिर्फ एक नमूना है, यह एक सेवा कॉल कर सकता है या जो कुछ भी आपको करने की ज़रूरत है।

    2

    मैं सुझाव दूंगा कि आप एंगुलर 2 ट्यूटोरियल की जांच करें जो कि आप जो पूछ रहे हैं उसके समान कुछ का एक साफ और समझाया गया उदाहरण दिखाएं।

    https://angular.io/docs/ts/latest/tutorial/toh-pt6.html#!#observables

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

    • कोई संबंधित समस्या नहीं^_^