【发布时间】:2017-01-17 20:19:33
【问题描述】:
我构建了一个 Web 应用程序,其中有很大一部分是动态生成的页面。 (99%)。
每个页面只是一个带有空模板的组件,其中所有数据都通过 url 的 slug 从多个服务 API 提供。
url 可以包含三个嵌套级别,每个级别都必须对应一个逻辑嵌套(从上下文的角度来看,我的意思是...友好)。
例如,一个显示某个国家/地区信息的应用:
- 地区 - http://example.com/regions
- 县 - http://example.com/regions/counties
- 城市 - http://example.com/regions/counties/city
url 使用的每个标记名都必须转换为有效的叠印名称:http://example.com/south-east/greater-london/london,就像俄罗斯娃娃一样。
路由器好像是这样的:
{
path: ':region-slug',
component: RegionComponent,
resolve: {
region: RegionResolver
}
},
{
path: ':region-slug/:countie-slug',
component: CountieComponent,
resolve: {
departement: CountieResolver
}
},
{
path: ':region-slug/:countie-slug/:city-slug',
component: CityComponent,
resolve: {
region: CityResolver
}
}
第一个问题,url可以是任何东西,它总是正确的:
- http://example.com/titi => 是的
- http://example.com/qsdsqd/azeaz => 是的
- http://example.com/titi/aze/toto156 => 是的
- ...
因此,我必须控制每个参数的有效性,以便在服务发现任何内容时获得模板的适当数据或重定向。
这是我的第一个问题:
- 我必须使用Resolve 或CanActivate 吗?
我猜这个工作最适合 Resolve 界面。我开始使用“解析器”为第一级(区域)实现它:
@Injectable()
export class RegionResolver implements Resolve<any>{
constructor(private regionsService: RegionService, private router: Router) { }
resolve(route: ActivatedRouteSnapshot): Observable<any> {
return this.regionsService
.getRegion(route.params['region-slug'])
.do(region => {
if(!region) this.router.navigate(['/404']);
});
}
}
而我在RegionController中得到了对应的数据:
export class RegionComponent implements OnInit {
region: Array<any> = [];
constructor(private route: ActivatedRoute) { }
ngOnInit() {
this.region = this.route.snapshot.data['region'];
}
}
目前很简单,但任务开始变得更加复杂,因为如果我对所有其他级别应用相同的行为,这种 url 在编程上将是正确的:
- http://example.com/south-east => 是的
- http://example.com/sdfsdfsdfsd/greater-london => 是的
- http://example.com/qsdq/toto54645/london => 是的
- ...
所以,问题:
- 我如何确保自己即使当前的评估 slug 是正确的,潜在的先前 slug(s) 也是正确的?
【问题讨论】:
标签: javascript angularjs angular nested angular2-routing