Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >CanActivate,动力学urls的解析器(多个嵌套动态段)

CanActivate,动力学urls的解析器(多个嵌套动态段)
EN

Stack Overflow用户
提问于 2017-01-17 12:19:33
回答 1查看 111关注 0票数 1

我构建了一个web应用程序,它在动态生成的页面中占了很大一部分。(99%)

每个页面只是一个带有空模板的组件,其中所有数据都是通过url的片段从提供的。

url可以包含三个嵌套级别,每个级别必须对应一个逻辑嵌套(从上下文的角度来看,我的意思是.友好的)。

例如,一个显示国家信息的应用程序:

  1. 区域- http://example.com/regions
  2. 县- http://example.com/regions/counties
  3. 城市- http://example.com/regions/counties/city

url使用的每个标签名都必须转换为一个有效的嵌入名:http://example.com/south-east/greater-london/london,就像俄罗斯娃娃一样。

路由器似乎是这样的:

代码语言:javascript
运行
AI代码解释
复制
{
    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可以是任何东西,它永远都是真的:

  1. http://example.com/titi =>真
  2. http://example.com/qsdsqd/azeaz =>真
  3. http://example.com/titi/aze/toto156 =>真
  4. ..。

因此,我必须控制每个param的有效性,以便删除模板的适当数据,或者如果服务创建任何内容,则重定向。

以下是我的第一个问题:

  1. 我必须使用解决还是CanActivate

我想这个工作最适合于解决接口。我开始用“解析器”为第一级(区域)实现它:

代码语言:javascript
运行
AI代码解释
复制
@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中得到了相应的数据:

代码语言:javascript
运行
AI代码解释
复制
export class RegionComponent implements OnInit {

  region: Array<any> = [];

  constructor(private route: ActivatedRoute) { }

  ngOnInit() {

    this.region = this.route.snapshot.data['region'];
  }
}

现在很容易,但是任务开始更复杂,因为如果我将相同的行为应用于所有其他级别,这种urls在编程上是正确的:

  1. http://example.com/south-east =>真
  2. http://example.com/sdfsdfsdfsd/greater-london =>真
  3. http://example.com/qsdq/toto54645/london =>真
  4. ..。

所以,问题:

  1. 我如何确保即使当前评估的段塞是正确的,潜在的前一段段塞也是正确的?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-18 13:59:46

据我所见,您就快到了:您的路由声明和解决方案似乎很好。

如果弹头无效,你为什么不直接从解析器中验证这些弹头并重定向到/404呢?

您可以创建这样的函数:

代码语言:javascript
运行
AI代码解释
复制
// 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;
}

然后在您的解析中使用它,如下所示:

代码语言:javascript
运行
AI代码解释
复制
@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...
  }
}

如果验证弹格的代码需要更复杂(例如,发出HTTP请求),请将are_slugs_valid()函数转换为服务,并使用DI将其注入解决方案中。

我尝试了我建议的代码,并获得了以下行为:

如果你想看密码,请告诉我。

编辑几个附加注意事项:

1)由于您可能要访问一个数据库来验证这些弹头,所以您需要对其进行优化。为什么不将所有可能的路径存储在数据库中呢?

代码语言:javascript
运行
AI代码解释
复制
ile-de-france
ile-de-france/val-de-marne
ile-de-france/val-de-marne/creteil
...

这样,对于最深的路径(如ile-de-france/val-de-marne/creteil ),您只需要一个查询就可以验证路径中包含的三个段塞(:region-slug:county-slug:city-slug)。

2)如果将path列添加到实体(即区域、县、市.)所在的同一表中存储时,只需要一个查询就可以加载实体并验证路径(路径充当实体的键)。

附带注意:如果您遵循我上面的建议,将您的代码保持在一个解决方案中是有意义的,因为它预先加载了一些数据并进行了一些验证,这就是解析的目的。如果您只想在不预先加载数据的情况下验证路径,我可能会将代码放在CanActivate服务中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41706205

复制
相关文章
获取git的提交内容
  Qt君最近工作需要发布一款软件,可是遇到了些问题。需要为软件写版本描述,但版本修改内容都在git的每个commit里面,用手动复制显然太浪费时间,不值得。
Qt君
2019/12/27
2.7K0
Jenkins: 获取文件变更列表、提交ID、提交人和提交信息
Jenkins — Get the latest changed files list, Commit ID, AuthorName, and Commit Message
DevOps云学堂
2022/12/29
2.9K0
Jenkins: 获取文件变更列表、提交ID、提交人和提交信息
从mysql获取到从redis获取 示例
1.因采集是每分钟写入一次数据库,故redis每分钟读取一次数据库最新信息,读取脚本如下:
葫芦
2019/04/13
2.4K0
从mysql获取到从redis获取 示例
flask使用request获取表单提交数据和获取url
web开发免不了需要获取用户提交的数据,Flask为我们提供了request对象来获取用户提交给服务器的数据。 下面是一个最基本的获取数据的例子:
菲宇
2022/05/06
3.1K0
SVN 命令行获取提交日志
可以看到,每次基本只能显示一条记录,大致是给定的日期开始时的最新版本的提交日志,所以获取的是给定日期前(前一天或更早之前)。但是有一个参数为当天(20220720)的,获取结果为空,不知何故。
独立观察员
2022/12/06
1.4K0
SVN 命令行获取提交日志
html获取表单提交数据_提交表单的两种方法
转载于:https://blog.csdn.net/yongwoozzang/article/details/83029128
全栈程序员站长
2022/11/08
2.7K0
Egg 中获取 POST 提交的数据
用过Koa的码农都知道,在Koa中获取POST提交的数据需要配置第三方的中间件,而Egg继承于Koa,在这一方面做了优化,获取POST提交的数据不需要再配置其它的中间件了,并添加了安全机制 CSRF 的防范,在Egg中获取用户提交的POST数据主要有以下两种方法。
越陌度阡
2020/11/26
1.6K0
从记录获取
Record.FieldCount(record as record) as number
逍遥之
2020/03/23
1.2K0
React技巧之表单提交获取input值
原文链接:https://bobbyhadz.com/blog/react-get-form-input-value-on-submit[1]
chuckQu
2022/08/19
1.6K0
React技巧之表单提交获取input值
python 从mysql获取变为redis获取
1.因采集是每分钟写入一次数据库,故redis每分钟读取一次数据库最新信息,读取脚本如下:
葫芦
2019/04/17
3.3K0
python 从mysql获取变为redis获取
[android] 从gallery获取图片
调用Intent对象的setAction()方法,设置动作,参数:Intent.ACTION_PICK
唯一Chat
2019/09/10
1.4K0
JQuery获取form表单数据及数据提交
JQuery获取表单数据 <form id="form-box">   ... </form> JSON字符串格式: let json = $('#form-box').serialize(); console.log('json: ', json); // 输出:json:name=w3h5&type=web 对象格式: let data = {}; let value = $('#form-box').serializeArray(); $.each(value, function (index, i
德顺
2020/12/10
7.8K0
后端获取不到axios.post提交的参数
部署运行项目后,发现后端这两个方法获取参数都是为null,后端又不想变更,于是前端想着怎么来解决这个问题。
青山师
2023/05/05
1.4K0
BlackCat勒索软件声称从Reddit 窃取了80GB的数据
据Security Affairs 6月18日消息,曾于今年2月5日攻击流行社交新闻聚合平台Reddit的幕后主使于近日浮出水面,BlackCat(又名 ALPHV)勒索软件组织发布消息称对这起网络攻击负责。
FB客服
2023/08/08
2130
BlackCat勒索软件声称从Reddit 窃取了80GB的数据
PHP获取当前页面的FORM表单提交
因为制作页面需求,需要在当前页面用php来响应,不做跳转。所以,研究了一下当前页面获取form表单提交的数据!
小唐同学.
2022/03/07
2.9K0
JQuery获取form表单数据及数据提交
未经允许不得转载:w3h5-Web前端开发资源网 » JQuery获取form表单数据及数据提交
德顺
2023/08/25
4550
C#网络爬虫实例:使用RestSharp获取Reddit首页的JSON数据并解析
Reddit 是一个非常受欢迎的分享社交新闻聚合网站,用户可以在上面发布和内容。我们的目标是抓取 Reddit 首页的数据 JSON,以便进一步分析和使用。
小白学大数据
2023/10/16
4600
如何从Facebook获取流量?
译者:Nic 审校:陈明艳 本文长度为4634字,预估阅读时间10分钟。 前言:作为重要的流量来源的Facebook,流量中究竟蕴藏了什么秘密,让我们一探究竟! Facebook带来数量相当可观
iCDO互联网数据官
2018/03/05
5.2K0
如何从Facebook获取流量?
【爬虫】获取Github仓库提交纪录历史的脚本 python
本脚本为第一版开发;后续会进行扩展 #! python3 import requests import time, datetime import json from colorama import Fore,Back,Style,init from bs4 import BeautifulSoup process = 0 output = 0 def req(type,addr,data='',**args): if type == 'get': try:
Mirror王宇阳
2020/12/16
1.4K0
Python开发实战教程(8)-向网页提交获取数据
Python应用现在如火如荼,应用范围很广。因其效率高开发迅速的优势,快速进入编程语言排行榜前几名。本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结。希望大家能够快速入门并学习Python这门语言。
做全栈攻城狮
2018/12/20
8850

相似问题

获取Reddit提交的正文?

11

从reddit获取图像

10

如何使用API获取Reddit提交的评论?

15

Reddit提交API 500错误

10

如何从reddit获取随机帖子

120
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档