首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Angular 9: queryParams正在向路由URL中添加额外的字符

基础概念

Angular 的 queryParams 是一种用于在路由之间传递参数的方式。这些参数会被编码并附加到 URL 中,以便在不同的路由组件之间共享数据。

相关优势

  • 简单易用:通过 queryParams 可以轻松地在不同的路由之间传递数据。
  • URL 可读性:参数直接显示在 URL 中,便于调试和理解。
  • 无状态:不需要在服务端存储状态,适合简单的应用场景。

类型

queryParams 可以传递字符串、数字、布尔值等基本类型,也可以传递对象,但对象会被序列化为 JSON 字符串。

应用场景

  • 在不同的页面之间传递搜索条件。
  • 在用户登录后传递用户信息。
  • 在多步骤表单中传递中间数据。

问题描述

你提到在使用 Angular 9 时,queryParams 正在向路由 URL 中添加额外的字符。这通常是由于参数编码或序列化问题引起的。

原因分析

  1. 参数编码问题:URL 中的某些字符需要进行编码,否则会导致 URL 不合法。
  2. 对象序列化问题:当你传递一个对象时,它会被序列化为 JSON 字符串,这个过程中可能会引入额外的字符。

解决方法

1. 确保参数正确编码

在传递参数之前,使用 encodeURIComponent 对参数进行编码:

代码语言:txt
复制
import { Router } from '@angular/router';

constructor(private router: Router) {}

navigateWithParams() {
  const param = 'some value with spaces';
  this.router.navigate(['/target-route'], {
    queryParams: { param: encodeURIComponent(param) }
  });
}

在目标组件中解码:

代码语言:txt
复制
import { ActivatedRoute } from '@angular/router';

constructor(private route: ActivatedRoute) {}

ngOnInit() {
  this.route.queryParams.subscribe(params => {
    const param = decodeURIComponent(params['param']);
    console.log(param);
  });
}

2. 处理对象参数

如果你需要传递一个对象,确保在目标组件中正确解析 JSON 字符串:

代码语言:txt
复制
navigateWithObjectParams() {
  const obj = { key: 'value', anotherKey: 'anotherValue' };
  this.router.navigate(['/target-route'], {
    queryParams: { obj: JSON.stringify(obj) }
  });
}

在目标组件中解析:

代码语言:txt
复制
ngOnInit() {
  this.route.queryParams.subscribe(params => {
    if (params['obj']) {
      const obj = JSON.parse(params['obj']);
      console.log(obj);
    }
  });
}

参考链接

通过以上方法,你应该能够解决 queryParams 向路由 URL 中添加额外字符的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Angular 从入坑到挖坑 - Router 路由使用入门指北

四、Step by Step 4.1、基础概念 4.1.1、base url 在 Angular 应用中,框架会自动将 index.html 文件中的 base url 配置作为组件、模板和模块文件的基础路径地址...在 Angular 项目中,系统的路由需要我们将一个 url 地址映射到一个展示的组件,因此需要手动的去设置 url 与组件之间的映射关系 因为我们在使用 Angular CLI 创建项目时,选择了添加路由模组...,这里我们在定义路由信息时,定义了一个空路径用来表示系统的默认地址,当用户请求时,重定向到 /home 路径上,因为只有完整的 url 地址匹配空字符串时才应该进行重定向操作,所以这里需要指定匹配模式是全部匹配...productId=xxxx">跳转 对于直接通过 a 标签进行的路由跳转,我们可以在 a 标签上通过绑定 queryParams 属性来添加查询参数信息 这里通过 queryParams 属性绑定的是一个对象...对于参数对象中的属性(key)对应的属性值(value),我们可以绑定一个组件中的属性进行动态的赋值,也可以通过添加单引号将参数值作为一个固定的数值,例如在下面代码中的两个查询参数就是固定的值 <a class

4.2K50

Angular 2 + 折腾记 :(4)初步了解路由及使用

,还可以完全不请求(在生命周期里面控制); angular 2 + 里面有两种url风格 一个是常规我们访问url那种protocol://domain/path/f/fds 一种的hash(#)风格,...路由相关的指令或者术语 :路由占位符,可以理解为渲染路由组件的区域,一个组件只能一个无命名,命名的可以多个 ng-content: 可以嵌套一个组件的内容在另外一个组件中...fragment:代码片段拼接到url,只接受字符串,在url就是hash拼接;/security-alert#1232 ActivatedRoute: 当前活动的路由,非常常用,逻辑处理的时候经常用到...navigate :配合可选参数可以实现当前路劲下的相对跳转,带参数跨页面跳转等 angular 4版本的路由加强了很多。。比如可以在路由进入或者脱离的时候做一些事件处理!!!...,也就是要生效必须到相应的模块中引入(NgModule)中import进去复制代码 ---- 小技巧 获取url的id // 根据是否存在id判断是新增还是修改 checkAction() {

3K20
  • angular基础面试题_java web面试题

    CurrencyPipe :把数字转换成货币字符串,根据本地环境中的规则进行格式化。 DecimalPipe:把数字转换成带小数点的字符串,根据本地环境中的规则进行格式化。...PercentPipe :把数字转换成百分比字符串,根据本地环境中的规则进行格式化angualr angular路由配置: 路由配置在 app.route.ts 中 路由跳转方式 [routerLink...]="['/devicepay']" [queryParams]="{id:key}" //路由跳转传参 //获取值 this.route.queryParams.subscribe((res)=>{...], 本模块向全局服务中贡献的那些服务的创建器。...灵活的路由,具备延迟加载功能 更容易学习 angular1是全局监听,变量越多性能越差,angular2采用模块化监听,提升了性能 在Angular 2应用中,我们应该注意哪些安全威胁?

    13K50

    Angular4中路由Router类中navigate跳转用法

    之前通过学习 angular4 框架的开发,它确实比以前有了很大的变化和改进,好多地方也不是那么容易就能理解,好在官方的文档和例子是中文,示例相对简单,对英文不太好的伙伴们学习还是有很大帮助。...官方地址:https://angular.cn/ 路由文档:https://angular.cn/api/router/Router#instance-methods 在学习的过程中首先要学习掌握框架的基础知识...,接着就是路由(router)机制的学习,项目开发中路由是离不开的,且好多地方都要用到。...name=1) this.router.navigate(['login', 1],{ queryParams: { name: 1 } }); 保留之前路由中的查询参数,将 preserveQueryParams...) this.router.navigate(['/role'], { preserveFragment: true }); 路由跳转时浏览器中的url会保持不变,但是传入的参数依然有效,将 skipLocationChange

    69400

    Angular路由实现原理

    他有如下特性:URL 中hash值的改变不会被触发页面的重载。页面发送请求时, hash 部分不会被发送。hash 值的改变,会记录在浏览器的历史记录,可使用浏览器的“后退”,“前进”触发页面跳转。...服务端不需要额外配置。实现起来更加简单。劣势:SEO 并不友好用户体验不好基于History API优势:URL 看起来和普通的url 一样, 更加美观简洁。...Angular路由实现已经了解了基本原理,那么Angular的路由又是怎么实现的呢。我到github上下载了angular路由实现的源码。...图片下一步构建UrlTree,queryParams即路由参数,会根据路由方式选择是否和原路由的参数合并。图片最终返回是一个构建完成的Url。通过构建的url和扩展参数开始导航。...图片后面实际处理路由请求时,还会对路由进行合并,路由守卫校验,设置活动路由等操作。这些都是angular提供的进阶的路由能力。基本的路由功能的实现看起来还是非常简单清晰的。

    81310

    浅谈Angular

    AngularJS 是以一个 JavaScript 文件形式发布的,可通过 script 标签添加到网页中。...--1.查询参数传值 利用queryParams属性传值--> queryParams]="{proName: '华为Meta X',...--2.路径参数传值,直接把要传递的参数写到routerLink的对应的值数组里,需要对路由配置做设置--> 9',3000]">商品展示...从Observable的中文名:”可观察的”就能看出,Observable的作用是可以起到类似监听的作用,但它的监听往往都是在跨页面中, 6.组件间通信: 1.父向子 -- @Input装饰器声明输入属性...,要声明在子组件里 2.子向父 -- @Output装饰器声明事件,要声明在子组件里 3.兄弟之间 -- 中间人模式 拓展:事件源对象 在事件中,当前操作的那个元素就是事件源。

    4.4K10

    Angular 18 引入了 Zoneless 变更检测

    开发人员可以通过在其应用程序的引导程序中添加如下的提供程序来尝试实验性的 zoneless 支持: bootstrapApplication(App, { providers: [ provideExperimentalZonelessChangeDetection...Angular.dev 是 Angular 文档的官方网站。其中包含了动手入门之旅、互动游乐场、更新的指南和简化的导航。所有对 angular.io 的请求现在都重定向到了 angular.dev。...现在可以在 Angular 18 中为 ng-content 指定默认的内容。这允许开发人员在他们的组件中提供回退内容。...18 通过允许使用返回动态重定向路由的函数,在路由重定向方面提供了更高的灵活性。...}) => { const errorHandler = inject(ErrorHandler); const userIdParam = queryParams['userId

    26410

    JSON Web Token(JWT)教程:一个基于Laravel和AngularJS的例子

    分隔的多个base64url编码的字符串组成的一个新字符串。它由三部分组成:头部(Header)、负载(Payload)与签名(Signature)。 ?...但是,如果我们要添加额外的保护层,可以使用JSON Web Encryption(JWE)规范对JWT payload进行加密。...当然,如果我们想避免使用JWE的额外开销,另一个选择是将敏感信息保留在我们的数据库中,并且在需要访问敏感数据时,使用我们的token进行额外的API调用。 为什么需要Web Tokens?....* 添加 JWTAuthServiceProvider 到我们 app/config/app.php  的providers array中。...当我们向一个API 服务器( server),如 api.jwt.dev/v1/restricted发出POST请求时,我们正在进行跨域请求,并且必须在后端启用CORS。

    30.6K10

    Angular v18 现已推出!

    () ]});添加提供程序后,从 中的 polyfill 中删除zone.js。...您可以在下面找到一个简单的电子商务网站的模拟。我们引入了人为加载延迟来模拟非常慢的网络连接。想象一下,当页面正在加载并且尚未补水时,用户想要将多个耳机添加到他们的购物车中。...此更改将加快您的 Angular CLI 安装时间。路由重定向作为函数为了在处理重定向时实现更高的灵活性,在 Angular v18 中,redirectTo 现在接受返回字符串的函数。...它提供了一些简洁的功能,例如基于文件的路由、API 路由、一流的 Markdown 支持等。Analog.js团队一直在尝试社区一直喜欢的单文件组件格式!...我们正处于世界第二大网站YouTube使用Angular的反应性原语的地方,我们正在作为一个更大的工作组的一部分,将Signals添加到Web平台。

    28010

    AngularDart4.0 英雄之旅-教程-07路由 顶

    由于路由器在自己的包中,首先将该包添加到应用的pubspec: ? 并非所有的应用程序都需要路由,这就是为什么Angular路由器处于独立的可选软件包中的原因。...Route对象: path:路由器将此字符串与浏览器地址栏(/ heroes)中的URL匹配。...路由链接 用户不必粘贴路由路径到地址栏。 相反,向模板添加一个锚点,点击后会触发到HeroesComponent的导航。...你已经完成了应用程序的路由。 您没有向模板添加英雄详情链接,因为用户单击导航链接不是为了查看特定的英雄; 而是点击一个英雄的名字,不管名字是显示在仪表板还是英雄列表中。...你正在向路由器的navigate()方法传递一个两元素链接参数列表(一个名字和路由参数),就像你在DashboardComponent中的[routerLink]绑定中一样。

    17.6K30

    Blazor 中的路由和路由模板

    此评估算法基于 URL 中发现的段及其在字符串中的位置。例如,文本段比参数段更具体,因此具有更多路由约束的参数段被视为比存在更少约束的其他段更具体。...路由器的实现是通过 SPA 框架(其中 Angular 最为出色)移动到客户端的。让我们花点时间对合并的 Angular 路由器和仍在使用的 Blazor 路由器中的功能进行简要比较。...类型匹配是参数路由和自动绑定到变量的常见问题。如果 URL 的段包含文本字符串,但绑定变量声明类型为 int,会发生什么情况?...它包括向每个 URL 参数添加类型属性,如下所示: @page “/user/view/{Id:int}” 参数的名称后跟冒号和表示 .NET 类型的文本。...如果当前页面 URL 与引用的 URL 匹配,则“活动”CSS 类将自动添加到由 NavLink 组件呈现的定位标记中。“活动”CSS 类的实现仍然是页面开发人员的责任。

    8.4K21

    【译】.NET Core 3.0 Preview 3中关于ASP.NET Core的更新内容

    内置的输入组件存在一些限制,我们希望在将来的更新中改进这些限制。例如,目前不能在生成输入标记上指定任意属性。将来,我们计划启用组件的所有额外属性。现在,您需要构建自己的组件子类来处理这些情况。...运行时验证 对运行时编译的支持已从.NET Core 3.0中的ASP.NET核心共享框架中删除,但现在可以通过向应用程序添加包的方式来启用它。...应用程序访问页面时,要求对用户进行身份验证,我们将[AuthorizeGuard]应用到正在配置的路由上。...路由 在preview3中,我们将SignalR hubs连接到最近发布的新端点路由特性中。...我们向Java客户端添加了长轮询支持,这使它能够在不支持WebSockets的环境中建立连接。

    22.7K10

    vuereact服务端渲染实例

    前端代码正常构建,然后打包生成文件,将打包后的文件放到后台渲染服务器的项目中。 后端添加和前端相同的路由,如果前端采用的不是问号加参数的方式(oecom.cn/article?...根据路由参数去接口服务器或者数据库、redis中查询获得数据,拼接成html,然后返回给页面,如果java则将打包后的index.html修改成jsp页面,通过el表达式渲染,如果是nodejs后台,则采用....js"> 上方代码是一个打包后的完整index页面,我在页面中通过模板语言来进行添加,判断是否有这个返回对象,如果有就进行渲染,渲染的部分样式设置为none...,并且前端路由采用的是用问号来添加参数的方式,我们后台封装了获取文章稿件的方法,获取成功以后将内容拼接好返回,也就是上面返回的data,如果查询失败这个data就是null,这个data中不仅包含TDK...添加热门排行的原因是让爬虫在网站中自行按照以后链接进行爬取,加快网页收录速度并增加收录量。

    93020

    Angular.js学习笔记(三)

    (|)和一个过滤器添加到指令中,该过滤器后跟一个冒号和一个模型名称。..., 也是一个单独发行的文件 - 安装或者下载angular-route的包 - 引入这个包 - 在自己的模块中添加 ngRoute 依赖 - 路由配置(配置路由规则) + 规则指的就是 什么样的请求 找什么控制器...+ [{url:'/sdf',controller:'MainController'}] - 编写对应的控制器和视图 实例解析1: 1、载入了实现路由的 js 文件:angular-route.js。...routeProvider.when 函数的第一个参数是 URL 或者 URL 正则规则,第二个参数为路由配置对象。...: 高级路由: 控制器中传入参数routeParams用来代表路由中的值,传入参数route,用于在switch(status)--'var status=routeParams.status'函数中的

    8.2K20
    领券