Angular4路由:ResolveStart事件永远不会结束

时间:2017-10-10 18:07:42

标签: angular angular2-routing

我有一个使用自定义<base href="/long/required/path/index.html">的哈希路由的Angular 4应用。这样做是因为需求声明此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状态吗?

免责声明:代码已经简化,因此我在寻找概念缺陷而不是语法

1 个答案:

答案 0 :(得分:5)

由于Observable尚未完成,因此ResolveEnd不会被触发。因此,尝试在下一次调用后完成Observable。应该发出丢失的事件。

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