2016-08-31 5 views
6

मैं चारों ओर नायक एप्लिकेशन इधर-उधर कोणीय 2 ट्यूटोरियल और अभी मैं इस घटक के साथ खेल रहा हूँकोणीय 2 प्रत्यक्ष पूरा नहीं बुलाया

import { Component, OnInit } from '@angular/core' 
import { Subject } from 'rxjs/Subject'; 
import { Hero } from "./hero"; 
import { Router } from "@angular/router"; 
import { HeroService } from "./hero.service"; 
import { BehaviorSubject } from "rxjs/BehaviorSubject"; 


@Component({ 
    selector: 'hero-search', 
    templateUrl: 'app/hero-search.component.html', 
    styleUrls: ['app/hero-search.component.css'], 
}) 
export class HeroSearchComponent implements OnInit{ 
    heroes: Hero[]; 
    isLoading: BehaviorSubject<boolean> = new BehaviorSubject(false); 
    error: any; 
    private searchNameStream = new Subject<string>(); 

    constructor(
     private heroService: HeroService, 
     private router: Router 
    ) {} 

    ngOnInit() { 
     this.searchNameStream 
      .debounceTime(400) 
      .distinctUntilChanged() 
      .switchMap(name => { 
       this.isLoading.next(true); 
       return this.heroService.getHeroesByName(name) 
      }) 
      .subscribe(
       heroes => this.heroes = heroes, 
       error => this.error = error, 
       () => { 
        console.log('completed'); 
        this.isLoading.next(false); 
       }) 
    } 

    // Push a search term into the observable stream. 
    search(Name: string): void { 
     this.searchNameStream.next(Name) 
    } 

    gotoDetail(hero: Hero): void { 
     let link = ['/detail', hero.id]; 
     this.router.navigate(link); 
    } 

} 

समस्या यह है कि, अगर मैं इसे सही ढंग से समझ, सदस्यता है तीन कॉलबैक पैरामीटर लेता है । लेकिन मेरे मामले में पूरा हिस्सा कभी निष्पादित नहीं होता है। मुझे लगता है कि स्विचमैप कैसे काम करता है इसके साथ कुछ करना है। क्या मैं सही हू?

+1

SearchNameStream कभी पूरा नहीं होता है, इसलिए स्विचमैप से प्राप्त अवलोकन योग्य कभी भी पूरा नहीं होता है। –

+0

यह देखे जाने योग्य नहीं है .heroService.getHeroesByName (नाम)? – Quba

+1

नहीं। प्रत्येक बार जब कोई खोज SearchNameStream द्वारा उत्सर्जित होता है, तो 'heroService.getHeroesByName()' कहा जाता है और इस "आंतरिक" पर्यवेक्षण द्वारा उत्सर्जित सभी घटनाओं को "बाहरी" देखने योग्य द्वारा प्रस्तुत किया जाता है, जब तक कि कोई नया ईवेंट उत्सर्जित न हो जाए searchNameStream, और यह प्रक्रिया दोहराती है। आपने बाहरी अवलोकन के लिए सदस्यता ली है, जो केवल तभी पूरा होगा जब SearchNameStream पूर्ण हो जाए। –

उत्तर

3

searchNameStream कभी पूरा नहीं होता है, इसलिए switchMap से प्राप्त अवलोकन योग्य कभी भी पूरा नहीं होता है।

हर बार एक घटना searchNameStream द्वारा उत्सर्जित होता है, heroService.getHeroesByName() कहा जाता है और सभी घटनाओं इस "आंतरिक" नमूदार, "बाहरी" नमूदार द्वारा reemitted कर रहे हैं जब तक एक नई घटना searchNameStream द्वारा उत्सर्जित होता है, और इस प्रक्रिया के द्वारा उत्सर्जित दोहराता है। आपने बाहरी अवलोकन के लिए सदस्यता ली है, जो केवल तभी पूरा होगा जब searchNameStream पूर्ण हो जाए।