Di salah satu template Angular 2 route saya ( FirstComponent ) saya memiliki tombol
first.component.html
<div class="button" click="routeWithData()">Pass data and route</div>
Tujuan saya adalah mencapai:
Klik tombol -> rute ke komponen lain sambil menyimpan data dan tanpa menggunakan komponen lain sebagai arahan.
Ini yang saya coba ...
PENDEKATAN 1
Dalam tampilan yang sama saya menyimpan pengumpulan data yang sama berdasarkan interaksi pengguna.
first.component.ts
export class FirstComponent {
constructor(private _router: Router) { }
property1: number;
property2: string;
property3: TypeXY; // this a class, not a primitive type
// here some class methods set the properties above
// DOM events
routeWithData(){
// here route
}
}
Biasanya saya akan rute ke SecondComponent oleh
this._router.navigate(['SecondComponent']);
akhirnya melewati data dengan
this._router.navigate(['SecondComponent', {p1: this.property1, p2: property2 }]);
sedangkan definisi tautan dengan parameter adalah
@RouteConfig([
// ...
{ path: '/SecondComponent/:p1:p2', name: 'SecondComponent', component: SecondComponent}
)]
Masalah dengan pendekatan ini adalah saya kira saya tidak bisa melewatkan data yang kompleks (misalnya objek seperti property3) di-url;
PENDEKATAN 2ND
Alternatif akan menyertakan SecondComponent sebagai arahan dalam FirstComponent.
<SecondComponent [p3]="property3"></SecondComponent>
Namun saya ingin merutekan ke komponen itu, tidak termasuk!
PENDEKATAN 3RD
Solusi paling layak yang saya lihat di sini adalah menggunakan Layanan (mis. FirstComponentService) untuk
- menyimpan data (_firstComponentService.storeData ()) pada routeWithData () di FirstComponent
- mengambil data (_firstComponentService.retrieveData ()) di ngOnInit () di SecondComponent
Sementara pendekatan ini tampaknya sangat layak, saya bertanya-tanya apakah ini adalah cara termudah / paling elegan untuk mencapai tujuan.
Secara umum saya ingin tahu apakah saya kehilangan pendekatan potensial lain untuk meneruskan data antar komponen, terutama dengan jumlah kode yang lebih sedikit
sumber
Pass data using Query Parameters
adalah apa yang saya cari. tautan Anda menyelamatkan hari saya.state
cek PR untuk detail lebih lanjut. Beberapa informasi berguna di siniJawaban:
perbarui 4.0.0
Lihat dokumen Angular untuk detail lebih lanjut https://angular.io/guide/router#fetch-data-before-navigating
asli
Menggunakan layanan adalah cara untuk pergi. Dalam params rute, Anda hanya harus meneruskan data yang ingin Anda tampilkan di bilah URL browser.
Lihat juga https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
Router yang dikirim dengan RC.4 memperkenalkan kembali
data
Lihat juga Plunker di https://github.com/angular/angular/issues/9757#issuecomment-229847781
sumber
ngOnInit() { this.myVar = this.route.snapshot.data['some_data']; }
NavigationExtras
- stackoverflow.com/a/54879389/1148107Saya pikir karena kita tidak memiliki $ rootScope semacam itu di sudut 2 seperti di sudut 1.x. Kita dapat menggunakan layanan / kelas sudut 2 saat dalam ngOnDestroy meneruskan data ke layanan dan setelah routing mengambil data dari layanan dalam fungsi ngOnInit :
Di sini saya menggunakan DataService untuk berbagi objek pahlawan:
Lulus objek dari komponen halaman pertama:
Ambil objek dari komponen halaman kedua:
Berikut ini contohnya: plunker
sumber
this.hero = this.dataService.hero
? Apakah saya akan mendapatkan nilainya?nah cara termudah untuk melakukannya dalam angular 6 atau versi lain yang saya harap adalah dengan mendefinisikan path Anda dengan jumlah data yang ingin Anda lewati
seperti yang dapat Anda lihat dari definisi rute saya, saya telah menambahkan status
/:id
ke data yang ingin saya sampaikan ke komponen melalui navigasi router. Karenanya kode Anda akan terlihat sepertiuntuk membaca
id
pada komponen, impor sajaActivatedRoute
likedan di
ngOnInit
tempat Anda mengambil dataAnda dapat membaca lebih lanjut di artikel ini https://www.tektutorialshub.com/angular-passing-parameters-to-route/
sumber
7.2.0 sudut memperkenalkan cara baru melewatkan data saat menavigasi antara komponen yang diarahkan:
Atau:
Untuk membaca keadaan, Anda dapat mengakses
window.history.state
properti setelah navigasi selesai:sumber
window.history.state
mengembalikan sesuatu seperti{navigationId: 2}
bukannya mengembalikan objek yang saya lewati.navigationId
dengan nilai yang ditambahkan. Jika tidak ada data yang ditambahkan, hanya yangnavigationId
akan ditampilkan. Lihatlah data yang lewat, kembali atau segarkan aplikasi Anda dan picu kembali tindakan yang menambahkan data ke rute dan bernavigasi ke rute berikutnya (mis. Klik tombol). Ini kemudian akan menambahkan data Anda ke objek.Beberapa orang super pintar (tmburnell) yang bukan saya menyarankan untuk menulis ulang data rute:
Seperti yang terlihat di sini di komentar.
Saya harap seseorang akan menemukan ini berguna
sumber
Saya ini pendekatan lain tidak baik untuk masalah ini. Saya kira pendekatan terbaik adalah Query-Parameter oleh
Router
angular yang memiliki 2 cara:Dengan kode ini Anda dapat menavigasi ke
url
olehparams
kode html Anda:Anda harus menyuntikkan router ke dalam
constructor
suka Anda :Sekarang gunakan itu seperti:
Sekarang jika Anda ingin membaca dari yang
Router
lainComponent
Anda harus menggunakanActivatedRoute
like:dan
subscribe
itu:sumber
Ini 2019 dan banyak jawaban di sini akan berhasil, tergantung pada apa yang ingin Anda lakukan. Jika Anda ingin melewati beberapa keadaan internal yang tidak terlihat di URL (params, query) Anda dapat menggunakan
state
sejak 7.2 (seperti yang saya pelajari hari ini :)).Dari blog (kredit Tomasz Kula) - Anda menavigasi ke rute ....
... dari ts:
this.router.navigateByUrl('/details', { state: { hello: 'world' } });
... dari templat HTML:
<a routerLink="/details" [state]="{ hello: 'world' }">Go</a>
Dan untuk mengambilnya di komponen target:
Terlambat, tapi harap ini membantu seseorang dengan Angular baru-baru ini.
sumber
Solusi dengan ActiveRoute (jika Anda ingin melewati objek dengan rute - gunakan JSON.stringfy / JSON.parse):
Siapkan objek sebelum mengirim:
Terima objek Anda di komponen tujuan:
sumber
super.ngOnInit();
?Pendekatan ke-3 adalah cara paling umum untuk berbagi data antar komponen. Anda dapat menyuntikkan layanan item yang ingin Anda gunakan dalam komponen terkait.
sumber
Lewati menggunakan JSON
sumber
menggunakan layanan bersama untuk menyimpan data dengan indeks khusus. lalu kirim indeks khusus itu dengan queryParam. pendekatan ini lebih fleksibel .
.
sumber
katakan kamu punya
dan Anda ingin meneruskan data ke component2.ts .
di component1.ts adalah variabel dengan data say
sumber
Anda dapat menggunakan BehaviorSubject untuk berbagi data antar komponen yang dirutekan. BehaviorSubject memegang satu nilai. Saat berlangganan, ia akan segera mengeluarkan nilai. Subjek tidak memiliki nilai.
Dalam layanan.
Dalam komponen Anda dapat berlangganan BehaviorSubject ini.
Catatan: Subjek tidak akan berfungsi di sini, Hanya perlu menggunakan Subjek Perilaku.
sumber