我需要检查当前网址是否有查询字符串。
网址可以是
http://localhost:4200/test?id=55555
或
http://localhost:4200/test
我用过
this.route.queryParams
.filter(params => 'id' in params)
.map(params => params.id)
.distinctUntilChanged()
.subscribe(
id=> {
//check lead Id here
console.log(id);
}
);
但这只适用于网址中有id的情况。不知道如何检查它是否存在。
答案 0 :(得分:8)
您可以在订阅功能中直接查看,如下所示:
this.route.queryParams.subscribe((params)=> {
//check lead Id here
if(params['id']){
console.log(params['id']);
} else {
console.log('id not found in params')
}
});
答案 1 :(得分:4)
我会说:
ngOnInit() {
if (this.route.snapshot.queryParams['id']) {
//do your stuff. example: console.log('id: ', this.route.snapshot.queryParams['id']);
}
}
就足够了。
不要忘记在构造函数中初始化private route: ActivatedRoute
和import { ActivatedRoute } from '@angular/router';
因为您只需要检查它是否存在。如果这样做,您的东西就会发生,就像添加一个布尔值以检查它是否被设置。如果它不存在,那么将不会发生任何事情。然后,如果您需要在组件中的其他地方做一些事情,您可以稍后检查 boolean 是否为true / false,这取决于您之前的设置方式。
答案 2 :(得分:1)
这是简单的方法:
this.route.queryParams.subscribe(
(params: Params) => {
if (params.hasOwnProperty('id')) { console.log(params['id']); }
}
);
答案 3 :(得分:0)
<强>初步强>
当订阅如下所示的queryParams时,params变量包含一个对象,其中键是所有查询参数,值可以是单个值或值数组。可以console.log(params);
来检查此结果。例如:
当网址为:http://example.com/?lion=10&lion=15&cat=20
时然后我们试着看看params持有什么:
this.route.queryParams.subscribe((params) => {
console.log(params);
});
结果将是一个对象,其中键是lion
和cat
但是值是狮子的数组,因为它有两次出现,而cat是单个值:
{ lion: [10, 15], cat:20 }
现在回答问题
我们将网址设为:http://example.com/?id&name=james
人们可以注意到id没有价值。网址可能只有一个密钥但没有值,但我们想知道密钥至少存在。如果我们这样做:
if(params['id']){
// do something
}
即使密钥ID存在,此条件也将返回false。我们可能实际上想要在单独存在密钥时执行某些操作,而在存在密钥和值时则执行其他操作。在这种情况下,我们可以使用lodash库来有效地对键和键/值结果进行排序。将lodash库导入项目后。可以使用 _.has 执行此操作:
// check if id key is present in params object first
if(_.has(params, 'id')) {
if(params['id']=="") {
// id key is present but has no value so do something
} else {
// id key is present and has a value as well so do something else
}
} else {
// since id key itself is not present do something totally different here
}
当然上面的代码假设id键只在url参数中出现一次。否则,必须循环遍历数组并检查每个值。
答案 4 :(得分:0)
我假设你在这里使用Angular Routing System。然后在组件的构造函数中注入当前激活的路径,如下所示:
constructor(private activatedRoute: ActivatedRoute)
然后检查你的ngOnInit(),如下:
ngOnInit() {
console.log("Hello ngOnInit");
let token = null;
this.activatedRoute.queryParamMap.subscribe((next : ParamMap) => {
token = next.get("token")
if (token) {
console.log(token);
} else {
console.log("no token given in url");
}
});
}
答案 5 :(得分:0)
由于没有人提到snapshot
的用法,我正在提供我的答案。如果你实际上不需要一个observable,意味着url被修改一次(例如用户导航到编辑页面),你可以利用更简洁的Snapshot替代方案。所以,在你的应用程序中你可以这样做:
constructor(private route: ActivatedRoute) {
}
ngOnInit(): void {
if (this.route.snapshot.params['id']) {
// id exists, so do something with it.
}
}
但请记住这一点:
请记住:您只能获得参数映射的初始值 这种技术。坚持使用可观察的paramMap方法 甚至路由器可以重新使用该组件的机会。这个样本 保留可观察的paramMap策略以防万一。