Вы можете сделать это относительно легко с помощью распознавателя маршрутов.
Это так.В вашей конфигурации маршрута вы указываете свой маршрут, компонент и resolver
.
const routes = [{
path: 'projects/:projectNumber',
component: DestinationComponent,
resolve: {
project: ProjectResolver
},
}];
Теперь вам нужно поместить этот маршрут в модуль, а предоставить упомянутый вами преобразователь * 1008.*.Например, вот так:
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
providers: [ProjectResolver],
})
export class ProjectDetailsModule {}
Но что это за ProjectResolver?Это просто инъецируемый класс, реализующий интерфейс Resolve Angular, который в своем методе resolve()
возвращает данные в виде данных, Promise или Observable.Выглядит это так:
import { Injectable } from '@angular/core';
import { Resolve } from '@angular/router';
// You will also need your service
import { ProjectService } from './project.service';
@Injectable()
export class ProjectResolver implements Resolve {
// Inject it with where the data comes from
constructor(private projectService: ProjectService) {}
// Now implement the resolve interface. Angular will give you the route,
// from which you can read the parameter.
resolve(route: ActivatedRouteSnapshot): Observable<Project> {
const projectNumber = route.snapshot.params['projectNumber'];
return this.projectService.getProjectByNumber(projectNumber);
}
}
Теперь нам нужно немного исправить вашу службу - метод http обычно асинхронный, поэтому вы должны вместо этого вернуть наблюдаемое:
// I'll change the return type, from Project, to Obsevable<Project>
getProjectByNumber(projectNumber: string): Observable<Project> {
return this.http.get(`${ httpBaseUrl }/project/getProject/${ projectNumber }`, httpOptions)
// Instead of subscribe, you'll use a pipe, to map. So that others can actually subscribe (in our case the Angular router)
.pipe(
map(data => {
this.logger.info("Received data, processing...");
project = data['projectDto'];
return project;
// This whole `map(...)` part could have been a one-liner:
// map(data => data.projectDto)
// so alltogether:
// this.http.get().pipe( map(data => data.projectDto), catchError(this.logger.error));
},
catchError(err => this.logger.error('Error getting project:', err.message)),
);
}
Толькоосталось одно.Как мы получаем данные один раз в компоненте?С маршрута снова.
// in the component
ngOnInit() {
this.activatedRoute.data.subscribe(project => this.project = project);
// or something like this for immediate value:
// this.data = this.route.snapshot.data;
}
Обратите внимание, что это будет держать вашу страницу в «загрузке», пока данные не вернутся.Если вы хотите получать данные параллельно, это другой ответ, но это также может быть сделано.