2017-10-10 9 views
1

私はカスタム<base href="/long/required/path/index.html">からのハッシュルーティングを使ってAngular 4アプリを持っています。これは、要件には、このURLがプロジェクトのルートでなければならないと記述されているために行われます。私はこれを解決するためにハッシュルーティングを使用しようとしています。Angular4 Routing:ResolveStartイベントが終了しない

私が見ている問題は、特定のルートのデータを解決することです。 URL localhost:8000/long/require/path/index.html#/project/1/document/55

app.routes.ts

export const ROUTES: Routes = [ 
{ 
    path: 'project/:projectId/document/:documentId', 
    component: DocumentViewerComponent, 
    resolve: { document: DataResolver} 
}, 
{ path: '**', component: NoContentComponent } 
]; 

を考えると、ここでリゾルバが実行され、意図したとおりにデータを取得します。

@Injectable() 
export class DataResolver implements Resolve<Document> { 

constructor(
private docService: DocumentService, 
) { } 

public resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Document> { 
this.docService.getDocument(route.params.workspaceId,route.params.documentId) 
    .subscribe(d => { 
    console.log('Document received, waiting for components to load?', d); 
    this.docService.documentRecieved(d); 
    } 
); 
return this.docService.recievedDocument$; 
} 
} 

documentService

@Injectable() 
export class DocumentService { 
    private recievedDocumentSource = new Subject<Document>(); 

    recievedDocument$ = this.recievedDocumentSource.asObservable(); 

    documentRecieved(document: Document) { 
    this.recievedDocumentSource.next(document); 
    } 

} 

ここでの意図は、他のコンポーネントがrecievedDocument$を購読し、新しいドキュメントの情報を得ることができるということです。これは現在Observableを購読してこのドキュメントを入手しています。しかし、<router-outlet>は私のメインコンポーネントをレンダリングせず、ActivatedRouteのスナップショットを確認した後、ルータはResolveStartルータイベントを入力しますが、ResolveEndイベントには到着しません。

1)アプローチは鳴っていますか?これは理にかなっていますか?

2)私がこのResolveStart状態にぶら下がっている理由は何ですか?

免責事項:コードが簡略化されたので、私が観察が完了していないので、ResolveEndがtriggredされていない構文

答えて

2

より概念的な欠陥を探しています。だから、次の呼び出しの直後にObservableを終了してみてください。行方不明のイベントが放出されるべきである。

内部では、オブザーバに通知する前に完了を待つconcatMapオペレータを使用します。

関連する問題