如何处理angular2中的查询参数
在我的routable component
中
@RouteConfig { {path: '/login', name: 'Login', component: LoginComponent} }
但是,如果我去app_url/login?token=1234
我怎么得到查询参数?
为了补充前面两个答案,Angular2同时支持路由中的查询参数和pathvariables。 在@RouteConfig
定义中,如果你在一个path中定义了参数,Angular2将它们作为pathvariables处理,如果不是,则作为查询参数处理。
我们来看一个例子:
@RouteConfig([ { path: '/:id', component: DetailsComponent, name: 'Details'} ])
如果你这样调用路由器的navigate
方法:
this.router.navigate( [ 'Details', { id: 'companyId', param1: 'value1' }]);
您将拥有以下地址: /companyId?param1=value1
。 获取参数的方式对于查询参数和pathvariables都是相同的。 它们之间的区别在于,pathvariables可以被视为必需参数和查询参数作为可选参数。
希望它能帮助你,Thierry
更新:在路由器alpha.31 http查询params更改后不再工作( matrix参数#2774 )。 相反,angular度路由器使用所谓的matrixURL表示法。
参考https://angular.io/docs/ts/latest/guide/router.html#!#optional-route-parameters :
可选的路由参数不能用“?”分开 和“&”,因为它们将在URL查询string中。 它们用分号隔开“;” 这是matrix的URL表示法 – 您以前可能没有看到过。
RouteParams现在被折旧,所以这里是如何在新的路由器中做到这一点。
this.router.navigate(['/login'],{ queryParams: { token:'1234'}})
然后在login组件中可以取参数,
constructor(private route: ActivatedRoute) {} ngOnInit() { // Capture the token if available this.sessionId = this.route.queryParams['token'] }
这里是文档
似乎RouteParams
不再存在,并由ActivatedRoute
取代。 ActivatedRoute
使我们可以访问matrixURL表示法参数。 如果我们想要查询string?
我们需要使用Router.RouterState
参数。 传统的查询string参数在路由中被持久化,这可能不是所期望的结果。 在路由器3.0.0-rc.1中保留片段现在是可选的。
import { Router, ActivatedRoute } from '@angular/router'; @Component ({...}) export class paramaterDemo { private queryParamaterValue: string; private matrixParamaterValue: string; private querySub: any; private matrixSub: any; constructor(private router: Router, private route: ActivatedRoute) { } ngOnInit() { this.router.routerState.snapshot.queryParams["queryParamaterName"]; this.querySub = this.router.routerState.queryParams.subscribe(queryParams => this.queryParamaterValue = queryParams["queryParameterName"]; ); this.route.snapshot.params["matrixParameterName"]; this.route.params.subscribe(matrixParams => this.matrixParamterValue = matrixParams["matrixParameterName"]; ); } ngOnDestroy() { if (this.querySub) { this.querySub.unsubscribe(); } if (this.matrixSub) { this.matrixSub.unsubscribe(); } } }
我们应该可以操纵?
航行时的记号,以及 符号,但我只是得到了matrix符号工作呢。 连接到最新的路由器文档的蠕虫显示它应该看起来像这样。
let sessionId = 123456789; let navigationExtras = { queryParams: { 'session_id': sessionId }, fragment: 'anchor' }; // Navigate to the login page with extras this.router.navigate(['/login'], navigationExtras);
这对我有用(从Angular 2.1.0开始):
constructor(private route: ActivatedRoute) {} ngOnInit() { // Capture the token if available this.sessionId = this.route.snapshot.queryParams['token'] }
(仅适用于儿童路线,例如/ hello-world)
在这种情况下,您想进行这种呼叫:
/你好世界?富=酒吧和水果=香蕉
Angular2不使用? 也不是 代替。 所以正确的URL应该是:
/你好世界;富=酒吧;水果=香蕉
并获得这些数据:
import { Router, ActivatedRoute, Params } from '@angular/router'; private foo: string; private fruit: string; constructor( private route: ActivatedRoute, private router: Router ) {} ngOnInit() { this.route.params.forEach((params: Params) => { this.foo = params['foo']; this.fruit = params['fruit']; }); console.log(this.foo, this.fruit); // you should get your parameters here }
来源: https : //angular.io/docs/ts/latest/guide/router.html
Angular2 v2.1.0 (稳定):
ActivatedRoute提供了一个可观察的订阅。
constructor( private route: ActivatedRoute ) { } this.route.params.subscribe(params => { let value = params[key]; });
每当路由得到更新时,都会触发:/ home / files / 123 – > / home / files / 321
angular度4:
我已经在下面包括JS(用于OG)和TS版本。
html的
<a [routerLink]="['/search', { tag: 'fish' } ]">A link</a>
在上面我使用链接参数数组请参阅下面的来源获取更多信息。
routing.js
(function(app) { app.routing = ng.router.RouterModule.forRoot([ { path: '', component: indexComponent }, { path: 'search', component: searchComponent } ]); })(window.app || (window.app = {}));
searchComponent.js
(function(app) { app.searchComponent = ng.core.Component({ selector: 'search', templateUrl: 'view/search.html' }) .Class({ constructor: [ ng.router.Router, ng.router.ActivatedRoute, function(router, activatedRoute) { // Pull out the params with activatedRoute... console.log(' params', activatedRoute.snapshot.params); // Object {tag: "fish"} }] } }); })(window.app || (window.app = {}));
routing.ts(摘录)
const appRoutes: Routes = [ { path: '', component: IndexComponent }, { path: 'search', component: SearchComponent } ]; @NgModule({ imports: [ RouterModule.forRoot(appRoutes) // other imports here ], ... }) export class AppModule { }
searchComponent.ts
import 'rxjs/add/operator/switchMap'; import { OnInit } from '@angular/core'; import { Router, ActivatedRoute, Params } from '@angular/router'; export class SearchComponent implements OnInit { constructor( private route: ActivatedRoute, private router: Router ) {} ngOnInit() { this.route.params .switchMap((params: Params) => doSomething(params['tag'])) }
更多信息:
“链接参数数组” https://angular.io/docs/ts/latest/guide/router.html#!#link-parameters-array
“激活的路线 – 路线信息的一站式服务” https://angular.io/docs/ts/latest/guide/router.html#!#activated-route
根据Angular2文档,你应该使用:
@RouteConfig([ {path: '/login/:token', name: 'Login', component: LoginComponent}, ]) @Component({ template: 'login: {{token}}' }) class LoginComponent{ token: string; constructor(params: RouteParams) { this.token = params.get('token'); } }
对于angular4
url:
http://example.com/company/100
路由器path:
const routes: Routes = [ { path: 'company/:companyId', component: CompanyDetailsComponent}, ]
零件:
@Component({ selector: 'company-details', templateUrl: './company.details.component.html', styleUrls: ['./company.component.css'] }) export class CompanyDetailsComponent{ companyId: string; constructor(private router: Router, private route: ActivatedRoute) { this.route.params.subscribe(params => { this.companyId = params.companyId; console.log('companyId :'+this.companyId); }); } }
控制台输出:
companyId:100