在Angular 2+中,ActivatedRoute
是一个服务,它包含与当前活动路由相关的信息。它提供了访问路由参数、查询参数、路由数据等的接口。
路由参数是指URL路径中的动态部分,例如/product/:id
中的:id
。
snapshot
(适用于一次性获取)import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-product',
templateUrl: './product.component.html',
styleUrls: ['./product.component.css']
})
export class ProductComponent implements OnInit {
productId: string;
constructor(private route: ActivatedRoute) { }
ngOnInit() {
this.productId = this.route.snapshot.params['id'];
console.log('Product ID:', this.productId);
}
}
params
Observable(适用于参数可能变化的情况)import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-product',
templateUrl: './product.component.html',
styleUrls: ['./product.component.css']
})
export class ProductComponent implements OnInit {
productId: string;
constructor(private route: ActivatedRoute) { }
ngOnInit() {
this.route.params.subscribe(params => {
this.productId = params['id'];
console.log('Product ID:', this.productId);
});
}
}
查询参数是指URL中?
后面的部分,例如/products?category=books
。
snapshot
(适用于一次性获取)import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-products',
templateUrl: './products.component.html',
styleUrls: ['./products.component.css']
})
export class ProductsComponent implements OnInit {
category: string;
constructor(private route: ActivatedRoute) { }
ngOnInit() {
this.category = this.route.snapshot.queryParams['category'];
console.log('Category:', this.category);
}
}
queryParams
Observable(适用于参数可能变化的情况)import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-products',
templateUrl: './products.component.html',
styleUrls: ['./products.component.css']
})
export class ProductsComponent implements OnInit {
category: string;
constructor(private route: ActivatedRoute) { }
ngOnInit() {
this.route.queryParams.subscribe(params => {
this.category = params['category'];
console.log('Category:', this.category);
});
}
}
原因:
解决方案:
ngOnInit
生命周期钩子中获取参数原因:
snapshot
方式获取参数解决方案:
OnChanges
生命周期钩子检测变化原因:
params
或queryParams
但没有取消订阅解决方案:
ngOnDestroy
中取消订阅import { Component, OnInit, OnDestroy } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Subscription } from 'rxjs';
@Component({...})
export class ProductsComponent implements OnInit, OnDestroy {
private routeSub: Subscription;
ngOnInit() {
this.routeSub = this.route.params.subscribe(params => {
// 处理参数
});
}
ngOnDestroy() {
this.routeSub.unsubscribe();
}
}
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-user-profile',
template: `
<div *ngIf="user">
<h2>{{user.name}}</h2>
<p>ID: {{userId}}</p>
<p>Edit mode: {{editMode}}</p>
</div>
`
})
export class UserProfileComponent implements OnInit {
userId: string;
editMode: boolean;
user: any;
constructor(private route: ActivatedRoute) {}
ngOnInit() {
// 获取路由参数
this.route.params.subscribe(params => {
this.userId = params['id'];
this.loadUser(this.userId);
});
// 获取查询参数
this.route.queryParams.subscribe(params => {
this.editMode = params['edit'] === 'true';
});
}
loadUser(id: string) {
// 模拟API调用
this.user = { id, name: `User ${id}` };
}
}
在这个示例中,我们同时使用了路由参数和查询参数,分别用于获取用户ID和判断是否处于编辑模式。
没有搜到相关的文章