我使用angular2.0.0-beta.7。当组件加载在/path?Query =value1它被重定向到/path。为什么GET参数被移除?如何保存参数?

我的路由器出错了。如果我有一条主干道

@RouteConfig([
  {
      path: '/todos/...',
      name: 'TodoMain',
      component: TodoMainComponent
  }
])

我的孩子就像

@RouteConfig([
  { path: '/', component: TodoListComponent, name: 'TodoList', useAsDefault:true },
  { path: '/:id', component: TodoDetailComponent, name:'TodoDetail' }
])

那么我就不能在TodoListComponent中获得参数。我所能得到的

params("/my/path;param1=value1;param2=value2") 

但我想要经典的

query params("/my/path?param1=value1&param2=value2")

当前回答

你只需要在构造函数中注入ActivatedRoute,然后在它上面访问params或queryParams

constructor(private route:ActivatedRoute){}
ngOnInit(){
        this.route.queryParams.subscribe(params=>{
        let username=params['username'];
      });
 }

在某些情况下,它在NgOnInit中不给出任何东西…可能是因为在初始化参数之前调用了init,在这种情况下,你可以通过函数debounceTime(1000)让可观察对象等待一段时间来实现这一点

如= >

 constructor(private route:ActivatedRoute){}
    ngOnInit(){
            this.route.queryParams.debounceTime(100).subscribe(params=>{
            let username=params['username'];
          });
     }

debounceTime()仅在特定的时间跨度过去而没有另一个源发射后,才从源可观察对象发出一个值

其他回答

查询和路径(Angular 8)

如果你有像https://myapp.com/owner/123/show?height=23这样的url,那么使用

combineLatest( [this.route.paramMap, this.route.queryParamMap] )
  .subscribe( ([pathParams, queryParams]) => {
    let ownerId = pathParams.get('ownerId');    // =123
    let height  = queryParams.get('height');    // =height
    // ...
  })

更新

如果你使用this.router.navigate([yourUrl]);你的查询参数被嵌入到你的URL字符串中,然后angular对URL进行编码,你会得到类似https://myapp.com/owner/123/show%3Fheight%323的东西——以上解决方案会给出错误的结果(queryParams将为空,如果它在路径端,查询参数可以粘在last path param上)。在这种情况下,改变导航的方式

this.router.navigateByUrl(yourUrl);

如果RouterState没有在路由中定义,你就不能从RouterState中获得参数,所以在你的例子中,你必须解析这个querystring…

下面是我使用的代码:

re = /[?&]([^=#&]+)=([^&#]*)/g; 让比赛; let isMatch = true; Let matches = []; while (isMatch) { Match = re.exec(window.location.href); If (match !== null) { match[decodeURIComponent(match[1])] = decodeURIComponent(match[2]); 如果匹配。index === re.lastIndex) { re.lastIndex + +; } } 其他{ isMatch = false; } } console.log(匹配);

如果你只想获得一次查询参数,最好的方法是使用take方法,这样你就不需要担心取消订阅。 下面是一个简单的片段:-

constructor(private route: ActivatedRoute) {
  route.snapshot.queryParamMap.take(1).subscribe(params => {
     let category = params.get('category')
     console.log(category);
  })
}

注意:如果你想在将来使用参数值,可以删除take(1)。

获取URL参数作为对象。

import { Router } from '@angular/router';
constructor(private router: Router) {
    console.log(router.parseUrl(router.url));
}

首先,我在使用Angular2时发现,带有查询字符串的url应该是/path;query=value1

在您使用的组件中访问它

constructor(params: RouteParams){
    var val = params.get("query");
}

至于为什么它会在加载组件时被删除,这不是默认行为。我在一个干净的测试项目中特别检查,没有被重定向或更改。它是默认路由还是其他关于路由的特殊的东西?

在https://angular.io/docs/ts/latest/guide/router.html#上阅读关于使用查询字符串和参数进行路由的Angular2教程!#查询参数