- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我构建了一个网络应用程序,其中很大一部分是动态生成的页面。 (99%)。
每个页面只是一个带有空模板的组件,其中所有数据均通过 url 的 slug 从多个服务 API 提供。
url 可以包含三个嵌套级别,每个级别都必须对应一个逻辑嵌套(从上下文的 Angular 来看,我的意思是……友好)。
例如,一个显示有关某个国家/地区的一些信息的应用程序:
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
}
}
第一个问题,网址可以是任何内容,它总是正确的:
因此,我必须控制每个参数的有效性,以便为模板提供适当的数据内容,或者在服务发现任何内容时进行重定向。
这是我的第一个问题:
我猜这个工作最适合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 在编程上将是正确的:
那么,问题:
最佳答案
据我所知,您已经快完成了:您的路线声明和解析看起来很好。
为什么不直接从解析中验证 slugs 并重定向到 /404
如果 slugs 无效?
您可以创建这样的函数:
// validate-slugs.ts
/**
* Return true if all given slugs are valid.
*/
export function are_slugs_valid(slugs: any): boolean {
const validRegions = ['ile-de-france', 'nord-pas-de-calais'];
const validCounties = ['val-de-marne', 'nord', 'pas-de-calais'];
// Validate region slug
if (slugs && slugs['region-slug'] && validRegions.indexOf(slugs['region-slug']) === -1) {
return false;
}
// Validate county slug
if (slugs && slugs['county-slug'] && validCounties.indexOf(slugs['county-slug']) === -1) {
return false;
}
// @TODO: Validate city slug...
return true;
}
然后在你的解析中使用它,如下所示:
@Injectable()
export class RegionResolver implements Resolve<any>{
constructor(private router: Router) { }
resolve(route: ActivatedRouteSnapshot): Observable<any> {
// NB. route.params contains ALL the slugs in the current route.
if (!are_slugs_valid(route.params)) {
this.router.navigate(['/404']);
}
// Proceed with fetching additional data...
}
}
如果验证 slugs 的代码需要更复杂(例如发出 HTTP 请求),请转换 are_slugs_valid()
将函数添加到服务中并使用 DI 将其注入(inject)解析中。
我尝试了我建议的代码,并获得了以下行为:
RegionComponent
)CountyComponent
)如果您想查看代码,请告诉我。
[编辑]一些额外的注意事项:
1) 由于您可能会访问数据库来验证段,因此您需要对其进行优化。为什么不在数据库中存储所有可能的路径?
ile-de-france
ile-de-france/val-de-marne
ile-de-france/val-de-marne/creteil
...
这样,对于最深的路径,例如 ile-de-france/val-de-marne/creteil
,您只需要一个查询即可验证路径中包含的三个 slugs( :region-slug
、 :county-slug
和 :city-slug
)。
2) 如果添加 path
列到存储实体(即地区、县、城市...)的同一个表中,您只需要一个查询来加载实体并验证路径(路径充当实体的键)。
旁注:如果您遵循我上面的建议,那么将代码保留在解析中是有意义的,因为它会预加载一些数据并进行一些验证,这就是解析的用途。如果您只是想验证路径而不预加载数据,我可能会将代码放在 CanActivate
中。服务。
关于javascript - CanActivate,动态 url 解析器(多个嵌套动态段),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41706205/
假设我拥有域 mydomain.com,并且我在服务器上有一个 Web 应用程序,网址为 http://99.99.99.99:1234/MyApplication/startpage.somethi
我正在尝试通过以下方式更新已解析的 URL: u, _ := url.Parse(s) if u.Scheme == "" { u.Scheme = "https" } if u.Path =
如何将 www.somesite.com/api(.*) 映射到 www.somesite.com/$1:9000? (我需要将/api 映射到运行 @ 端口 9000 的 Play 框架应用程序)
我有一个资源结构,如航类 > 座位 > 预订,所以预订属于某个航类的某个座位: http://example.com/jdf_3prGPS4/1/jMBDy46PbNc
我想知道以下网址是否有效。 路径中的点,在主机之后: http://www.example.com/v.b.w..com 主机中的点,作为子域的一部分: http://v.b.w..co.manufa
我有两个域 - crmpicco.co.uk 和 ayrshireminis.com - 如果我浏览到: www.crmpicco.co.uk/mini/new我希望能够重定向到 www.ayrshi
我正在尝试使用 URL 重写和应用程序请求路由来重写到外部 URL。我设置了以下规则: 在规则中,“patternToMatch”是我试
我已经安装了带有 SharePoint 和 Url Rewrite 模块的 IIS 7.0。 是以下句子还是我配置错误才能看到这个结果? Url Redirect 可以将 url 重定向到任何内部(在
我想知道,为了获得良好的 SEO,您必须在 URL 中使用自然语言。您知道字符中单词或短语的最大大小吗?例如: www.me.com/this-is-a-really-long-url.htm 我问这
有人知道在 SEO 友好 URL 中使用逗号有什么问题吗?我正在使用一些在其 SEO 友好 URL 中使用大量逗号的软件;但我 100% 肯定我见过一些程序/平台无法正确识别 URL 并在第一个逗号后
我有一个网站,我正在为所有链接使用干净的 URL。我想知道对于简短的基本 URL 与较长的描述性 URL 有何看法。 例如,如果我的网站是关于 Georgia Bulldog 足球新闻的,那么哪个网站
我正在编写一个类似于 tinyurl 的 URL 缩短器,我想知道如何跟踪已经使用我的服务缩短的 URL?例如,tinyurl 为相同的长 URL 生成相同的小 URL,而不管是谁创建的。如
我是 magento 的新手。我正在开发一个模块。为此,我有一些要显示链接的 css 和 js 文件。我目前有类似 的链接 getSkinUrl('module_tryouts/css/jquery.
我想基于 HTTP_URL 重写 URL 以重定向到不同的端口,同时保留其余的 URL 和查询字符串(如果指定)。例如, http://host/john/page.aspx 应该重定向到 http:
我遇到了以下问题: 我的 Grails (2.2.0) 应用程序具有以下 URL 映射: "/api/clientQuote/$labcode/$cliCode/$quoCode"(controlle
我有一个很长的 URL,它不适合 URL 字段。它一直在修剪。该怎么办?有没有办法增加 SharePoint 2010 中的 URL 字段字符限制? 或者解决方法来容纳长 URL。例如,以下 URL
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
我们从客户以前的开发人员那里继承了相当多的 Google Apps 脚本项目。 Apps 脚本通过嵌入式小部件部署在 Google 网站 (sites.google.com) 的各个页面上。每当我们需
我正在编写一些文档,但遇到了一些词汇问题: http://www.example.com/en/public/img/logo.gif 被称为“绝对”网址,对吗? ../../public/img/l
我们从客户以前的开发人员那里继承了相当多的 Google Apps 脚本项目。 Apps 脚本通过嵌入式小部件部署在 Google 网站 (sites.google.com) 的各个页面上。每当我们需
我是一名优秀的程序员,十分优秀!