angular - Angular - [routerLink] 在同一模块中重定向的问题
问题描述
目前我正在尝试使用 Angular 9 进行 SPA。我使用此路由 localhost:4200/products 制作了一个名为 products 的模块,并使用此路由 http://localhost:4200/products/(number_id_product) 查找指定产品
我想在每次需要查看产品时实现这个组件。我的问题是,当我使用带有 [routerlink] 的链接从当前产品页面转到另一个产品时,(http://localhost:4200/products/1 到 http://localhost:4200/products/2)url 更改但内容页面不会更改并保留上一个产品的相同信息。
我不知道 [routerlink] 重定向发生了什么
我的代码.ts
import { Component, OnInit } from '@angular/core';
import { Product } from 'src/app/shared/models/product';
import { ActivatedRoute } from '@angular/router';
import { ProductsService } from 'src/app/shared/services/products.service';
@Component({
selector: 'ec-product-description',
templateUrl: './product-description.component.html',
styleUrls: ['./product-description.component.css']
})
export class ProductDescriptionComponent implements OnInit {
id: string;
product: Product
constructor(private route: ActivatedRoute, private service: ProductsService) { }
ngOnInit(): void {
this.id= this.route.snapshot.paramMap.get('id')
//get products/id
this.service.getProduct(this.id)
.subscribe(prod=>{
console.log(`Prod ↓ `)
console.log(prod)
this.product=prod
})
}
}
我的代码 html
<div class="container-product">
<h1>{{product.title}}</h1>
<img mat-card-image [src]="product.thumbImage">
<span class="product-descrp">{{product.description}}</span>
<span [routerLink]="['','products','another_id_product']">See another product!</span>
</div>
解决方案
有问题的两个 URL(即/products/1
和/product/2
)都匹配相同的路径定义/products:id
。因此,当从/products/1
到移动时/products/2
,匹配路径保持不变,这意味着路由器使用的组件保持不变。默认情况下,组件不会被销毁和重新渲染。
如果您希望您的组件在不同的产品 ID 之间切换,您应该对其进行重构,以便它不会只读取一次路由参数,就像您在以下代码中所做的那样ngOnInit
:
this.id= this.route.snapshot.paramMap.get('id')
相反,您应该观察路由器发出的变化,并对它们做出相应的反应。
this.route.paramMap.pipe(
map(paramMap => paramMap.get('id')),
switchMap(id => this.service.getProduct(id)),
).subscribe(prod => {
console.log(prod)
this.product = prod
})
现在,无论何时paramMap
更改,id
都会从中提取,并通过 servicegetProduct
方法发出请求。一旦响应到达,传递给subscribe
方法的函数就会运行并this.product
更新。
推荐阅读
- sql - 查询检索数据
- excel - 在 VBA 中将 Excel 工作簿转换为 CSV
- angular - 打开静态子页面时如何防止后端调用?
- git - 从 GITHUB 恢复 SSH 密钥
- javascript - Javascript 和 Java 中 +(concatenation) 与 == 的运算符优先级
- flutter - 通过 putifAbsent 方法添加新项目后,我的地图没有更新
- c++ - 关于 std::min、std::max 中的比较运算符的困惑
- c# - ImageFactory 正在生成大于 .jpeg 文件的 .webp 文件
- windows - 将一个父目录包含的子目录中的所有文件移动到N个子子目录中
- javascript - 按值中的第一个字符对 JSON 对象数组进行分组时,如何将所有以数字开头的字符分组到同一组中?