2016-08-21 17 views
22

Po wypuszczeniu Angular 2 RC.5 wprowadzono rozwiązanie routera. Here zademonstrował przykład z Obietnicą, jak zrobić to samo, jeśli zgłoszę się do serwera z obserwacją?Rozstrzygnięcie 2 rastra kątowego z obserwowalnym

search.service.ts

... 
searchFields(id: number) { 
    return this.http.get(`http://url.to.api/${id}`).map(res => res.json()); 
} 
... 

search-resolve.service.ts

import { Injectable } from '@angular/core'; 
import { Router, Resolve, ActivatedRouteSnapshot } from '@angular/router'; 
import { Observable } from 'rxjs/Observable'; 

import { SearchService } from '../shared'; 

@Injectable() 
export class SearchResolveService implements Resolve<any> { 

    constructor(
    private searchService: SearchService , 
    private router: Router 
) {} 

    resolve(route: ActivatedRouteSnapshot): Observable<any> | Promise<any> | any { 
    let id = +route.params['id']; 
    return this.searchService.searchFields(id).subscribe(fields => { 
     console.log('fields', fields); 
     if (fields) { 
     return fields; 
     } else { // id not found 
     this.router.navigate(['/']); 
     return false; 
     } 
    }); 
    } 
} 

search.component.ts

ngOnInit() { 
    this.route.data.forEach((data) => { 
    console.log('data', data); 
    }); 
} 

Get Object {fields: Subscriber} zamiast rzeczywistych danych.

+0

Proszę napisać kod, który pokazuje, co próbowali. –

+1

Mam zaktualizowane pytanie z przykładami kodu – neilhem

Odpowiedz

41

Nie dzwoń pod numer subscribe() w swojej usłudze i zamiast tego pozwól, aby trasa została zasubskrybowana.

Zmień

return this.searchService.searchFields().subscribe(fields => { 

do

import 'rxjs/add/operator/first' // in imports 

return this.searchService.searchFields().map(fields => { 
    ... 
}).first(); 

ten sposób, Observable jest zwracana zamiast Subscription (który jest zwracany przez subscribe()).

Obecnie router czeka na zakończenie obserwowalne. Możesz upewnić się, że zamknie się po emisji pierwszej wartości, używając operatora first().

+0

Dzięki Günter. Szukałem sposobu, aby uzyskać to, co można zaobserwować. '.map' ma sens. Jednak teraz, gdy używam '.map' w moim resolwerze, trasa nigdy nie wydaje się rozwiązywać. Dostaję się do mojej funkcji '.map' w moim resolwerze i widzę tam moje dane, ale nigdy nie dostaję się do ngOnInit mojego komponentu. Mój resolver wygląda tak: 'return this.eventService.getEvents(). Map (events => events)' i moja trasa wygląda następująco '..., resolve: {events: EventListResolver}}'. Widzisz coś oczywistego, że robię źle? –

+2

@JimCooper Obecnie router czeka na zakończenie obserwowalne. Możesz upewnić się, że zostanie zamknięty po wydaniu pierwszej wartości za pomocą operatora 'take()'. Zaktualizowałem moje zadanie. –

+1

Ahh, to ma sens. Przypuszczam, że mógłbym też naprawić to, upewniając się, że moja metoda 'getEvents()' kończy moją obserwowalną sekwencję (tj. Wyzwalanie onComplete). Dzięki! –

Powiązane problemy