私はangular2.0.0-beta7を使います。コンポーネントが/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¶m2=value2")
ActivatedRoute
のインスタンスを注入することで、queryParams
やparams
オブザーバブルを含むさまざまなオブザーバブルを購読することができます。
import {Router, ActivatedRoute, Params} from '@angular/router';
import {OnInit, Component} from '@angular/core';
@Component({...})
export class MyComponent implements OnInit {
constructor(private activatedRoute: ActivatedRoute) {}
ngOnInit() {
// Note: Below 'queryParams' can be replaced with 'params' depending on your requirements
this.activatedRoute.queryParams.subscribe(params => {
const userId = params['userId'];
console.log(userId);
});
}
}
購読中止に関するメモ
@Retoと@ codef0rmerは、公式の文書によると、components unsubscribe()
メソッド内のonDestroy()
はこのインスタンスでは不要であることを非常に正しく指摘していました。これは私のコードサンプルから削除されました。 ( this チュートリアルの登録解除が必要ですか?セクションを参照してください)
このようなURLのとき http://stackoverflow.com?param1=value
次のコードでparam1を取得できます。
import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute, Params } from '@angular/router';
@Component({
selector: '',
templateUrl: './abc.html',
styleUrls: ['./abc.less']
})
export class AbcComponent implements OnInit {
constructor(private route: ActivatedRoute) { }
ngOnInit() {
// get param
let param1 = this.route.snapshot.queryParams["param1"];
}
}
質問がversion beta 7 を指定していても、この質問は Angular 2クエリパラメータ のような一般的なフレーズについてGoogleでトップの検索結果として表示されます。そのため、最新のルーター(現在は alpha 7 に入っています)に対する答えがここにあります。
パラメータの読み方が劇的に変わりました。まず、Router
という依存関係をコンストラクタのパラメータに挿入する必要があります。
constructor(private router: Router) { }
その後、ngOnInit
メソッドでクエリパラメータを購読することができます(コンストラクタも大丈夫ですが、テストのためにngOnInit
を使用する必要があります)。
this.router
.routerState
.queryParams
.subscribe(params => {
this.selectedId = +params['id'];
});
この例では、example.com?id=41
のようなURLからクエリパラメータ id を読みます。
注意すべきことがまだいくつかあります。
params['id']
のようにparams
のプロパティにアクセスすると、常に 文字列 が返されます。これに+
を付けることで number に変換できます。私は@ StevePaulの回答が本当に気に入りましたが、無関係の購読/購読中止の電話をかけなくても同じことができます。
import { ActivatedRoute } from '@angular/router';
constructor(private activatedRoute: ActivatedRoute) {
let params: any = this.activatedRoute.snapshot.params;
console.log(params.id);
// or shortcut Type Casting
// (<any> this.activatedRoute.snapshot.params).id
}
import { Router } from '@angular/router';
this.router.navigate([ '/your-route' ], { queryParams: { key: va1, keyN: valN } });
import { ActivatedRoute } from '@angular/router';
this.activatedRoute.queryParams.subscribe(params => {
let value_1 = params['key'];
let value_N = params['keyN'];
});
こんにちはあなたはURLSearchParamsを使用することができます、あなたはそれについての詳細を読むことができます ここ 。
インポート:
import {URLSearchParams} from "@angular/http";
そして機能:
getParam(){
let params = new URLSearchParams(window.location.search);
let someParam = params.get('someParam');
return someParam;
}
Notice :すべてのプラットフォームでサポートされているわけではなく、角度付きドキュメントでは "実験"状態になっているようです
まず最初に、Angular 2を使って作業したところ、クエリ文字列を含むURLは/path;query=value1
になります。
あなたが使用するコンポーネントの中でそれにアクセスするためにこれはそうです、しかし今コードブロックに従います:
constructor(params: RouteParams){
var val = params.get("query");
}
コンポーネントをロードしたときになぜそれが削除されるのかということに関しては、それはデフォルトの振る舞いではありません。私は特にクリーンなテストプロジェクトをチェックし、リダイレクトも変更もしませんでした。それはデフォルトルートなのか、それともルーティングに関して特別なものなのか。
https://angular.io/docs/ts/latest/guide/router.html#!#query-parameters にあるAngular 2チュートリアルで、クエリ文字列とパラメータを使用したルーティングについてお読みください。
以下に示すようにActivatedRouteを使用してURLで渡されると、クエリパラメータを取得できます。
uRL: - http:/domain.com?test = abc
import { Component } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'my-home'
})
export class HomeComponent {
constructor(private sharedServices : SharedService,private route: ActivatedRoute) {
route.queryParams.subscribe(
data => console.log('queryParams', data['test']));
}
}
オブジェクトとしてURLパラメータを取得します。
import { Router } from '@angular/router';
constructor(private router: Router) {
console.log(router.parseUrl(router.url));
}
今です:
this.activatedRoute.queryParams.subscribe((params: Params) => {
console.log(params);
});
クエリパラメータを一度だけ取得したい場合は、 take methodを使用するのが最善の方法です。そのため、登録解除の心配はありません。これが簡単なスニペットです: -
constructor(private route: ActivatedRoute) {
route.snapshot.queryParamMap.take(1).subscribe(params => {
let category = params.get('category')
console.log(category);
})
}
注: 削除 take(1) 将来パラメータ値を使用する場合。
あなたはただコンストラクタにActivatedRouteを注入する必要がありますそしてそれからちょうどparamsかqueryParamsにアクセスする
constructor(private route:ActivatedRoute){}
ngOnInit(){
this.route.queryParams.subscribe(params=>{
let username=params['username'];
});
}
いくつかのケースではNgOnInitで何もしていません...おそらくこのケースではparamsの初期化前のinit呼び出しのために関数debounceTime(1000)を使ってobservableにしばらく待つように依頼することでこれを達成できます。
例=>
constructor(private route:ActivatedRoute){}
ngOnInit(){
this.route.queryParams.debounceTime(100).subscribe(params=>{
let username=params['username'];
});
}
debounceTime()別の発生源の放出なしに特定の期間が経過した後にのみ観察可能な発生源から値を放出します
私はそれが他の誰かに役立つことを願っています。
上記の質問は、ページがリダイレクトされた後にクエリパラメータ値が必要であると述べており、スナップショット値(観察不可能な代替方法)で十分であると考えることができます。
公式ドキュメント からsnapshot.paramMap.getについてここで言及した人はいません。
this.route.snapshot.paramMap.get('id')
それで送信する前に、送信/リダイレクトコンポーネントにこれを追加します。
import { Router } from '@angular/router';
それから(文書化された ここ のように)リダイレクトしてください:
this.router.navigate(['/heroes', { id: heroId, foo: 'foo' }]);
または単に:
this.router.navigate(['/heroes', heroId ]);
文書化されているようにルーティングモジュールにこれを追加したことを確認してください ここ :
{ path: 'hero/:id', component: HeroDetailComponent }
そして最後に、クエリパラメータを使用する必要があるコンポーネントで
インポートを追加します(文書化された ここ ):
import { Router, ActivatedRoute, ParamMap } from '@angular/router';
activatedRouteを注入する
(ドキュメンテーションはswitchMapもインポートし、RouterとHeroServiceもインジェクトします - ただし、それらは観察可能な代替手段にのみ必要です - 私たちの場合のようにスナップショット代替手段を使用する場合には必要ありません)。
constructor(
private route: ActivatedRoute
) {}
そしてあなたが必要とする価値を手に入れなさい(文書化された ここ ):
ngOnInit() {
const id = this.route.snapshot.paramMap.get('id');
}
注:ROUTING-MODULEをFEATURE MODULE(文書に表示されているように)に追加する場合、APPRModule(またはルートレベルのアプリケーション経路を持つ他のファイル)の前にAPP.MODULE.tsがあることを確認します。それ以外の機能のルートは見つかりません({path: '**'、redirectTo: '/ not-found'}の後に来ると、not-foundメッセージしか表示されません)。
それがルートで定義されていない場合、あなたはRouterStateからパラメータを取得することはできません、あなたの例では、あなたはクエリ文字列を解析する必要があります...
これが私が使ったコードです:
let re = /[?&]([^=#&]+)=([^&#]*)/g;
let match;
let isMatch = true;
let matches = [];
while (isMatch) {
match = re.exec(window.location.href);
if (match !== null) {
matches[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);
if (match.index === re.lastIndex) {
re.lastIndex++;
}
}
else {
isMatch = false;
}
}
console.log(matches);
Steve Paulの解決法のバリエーションです。不要なivarsを避けるため、ngOnDestroy
の間にunsubscribe()
呼び出しをする必要がなくなり、take(1)
を使ってobservableを購読するだけで、最初の値の後に自動的に解放されます。
import 'rxjs/add/operator/take';
import {Router, ActivatedRoute} from '@angular/router';
@Component({...})
export class MyComponent implements OnInit {
constructor(private activatedRoute: ActivatedRoute) {
this.activatedRoute.params.take(1).subscribe((params: any) => {
let userId = params['userId'];
console.log(userId);
});
}
}