2016-08-21 17 views
22

角2 RC.5のリリース後、ルータ解決が導入されました。 Here私はObservableを使ってサーバーに要求した場合、Promiseの例を示しました。角2ルータがObservableで解決する

search.service.ts

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

検索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); 
    }); 
} 

ではなく、実際のデータのObject {fields: Subscriber}を取得します。

+0

あなたが試したことを示すコードを投稿してください。 –

+1

コード例で質問を更新しました – neilhem

答えて

41

サービスでsubscribe()に電話して、ルートを購読しないでください。

変更

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

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

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

subscribe()によって返される)Observable代わりSubscriptionで戻される。このように。

現在、ルータは観察可能なものが閉じるのを待ちます。 first()演算子を使用すると、最初の値が出力された後に閉じられることを保証できます。

+0

ありがとうございましたGünter。私はそれを観察可能なものに戻す方法を模索していました。 '.map'は意味があります。しかし、私はリゾルバで '.map'を使っているので、決して解決されないようです。私はリゾルバの '.map'関数に入ってデータを見ることができますが、自分のコンポーネントのngOnInitには絶対に入りません。私のリゾルバはこの 'return this.eventService.getEvents()。map(events => events)'のようになり、私のルートは '...、resolve:{events:EventListResolver}}'のようになります。私が間違っていることが明らかな何かを見ますか? –

+2

@JimCooper現在、ルーターは観測対象が閉じるのを待ちます。 'take()'演算子を使って、最初の値が出力された後に閉じられることを保証することができます。私は自分のクエストを更新しました。 –

+1

ああ、意味があります。私は私の 'getEvents()'メソッドが私の観測可能なシーケンスを終了させるように(つまり、onCompleteを起動させることによって)修正することもできると思います。ありがとう! –

関連する問題