2017-10-10 56 views
1

我有一个使用自定义<base href="/long/required/path/index.html">哈希路由的Angular 4应用程序。这是因为需求声明这个URL必须是项目的根。我正在尝试使用散列路由来解决这个问题。Angular4路由:ResolveStart事件永不结束

我看到的问题涉及解析给定路线的数据。由于使用网址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状态?

免责声明:代码已经被简化了,所以我在寻找概念的缺陷超过句法

回答

2

的ResolveEnd不triggred因为可观察到未完成。所以,在下一次通话之后尝试完成Observable。应该排除遗漏的事件。

在内部,Angular使用concatMap操作符,它在通知观察者之前等待完成。