Saya memiliki ListComponent. Ketika sebuah item diklik di ListComponent, rincian item itu harus ditampilkan di DetailComponent. Keduanya ada di layar pada saat bersamaan, jadi tidak ada perutean yang terlibat.
Bagaimana cara memberi tahu DetailComponent item apa di ListComponent yang diklik?
Saya telah mempertimbangkan untuk memancarkan acara hingga induknya (AppComponent), dan meminta induk mengatur selectedItem.id di DetailComponent dengan @Input. Atau saya bisa menggunakan layanan bersama dengan langganan yang dapat diamati.
EDIT: Mengatur item yang dipilih melalui event + @Input tidak memicu DetailComponent, meskipun, jika saya perlu menjalankan kode tambahan. Jadi saya tidak yakin ini adalah solusi yang dapat diterima.
Tetapi kedua metode ini tampaknya jauh lebih kompleks daripada cara Angular 1 dalam melakukan sesuatu melalui $ rootScope. $ Broadcast atau $ scope. $ Parent. $ Broadcast.
Dengan semua yang ada di Angular 2 menjadi sebuah komponen, saya terkejut tidak ada lebih banyak informasi di luar sana tentang komunikasi komponen.
Apakah ada cara lain / lebih mudah untuk mencapai ini?
sumber
Jawaban:
Diperbarui ke rc.4: Ketika mencoba untuk mendapatkan data yang diteruskan antara komponen saudara di angular 2, Cara termudah saat ini (angular.rc.4) adalah dengan memanfaatkan injeksi ketergantungan hierarki angular2 dan membuat layanan bersama.
Inilah layanannya:
Sekarang, inilah komponen PARENT
dan kedua anaknya
anak 1
anak 2 (Itu saudara kandung)
SEKARANG: Hal-hal yang perlu diperhatikan saat menggunakan metode ini.
sumber
directives
tidak lagi dideklarasikan di komponen.Dalam kasus 2 komponen yang berbeda (bukan komponen bersarang, induk \ anak \ cucu) saya sarankan Anda ini:
sumber
Salah satu cara untuk melakukannya adalah dengan menggunakan layanan bersama .
Namun saya menemukan solusi berikut jauh lebih sederhana, ini memungkinkan untuk berbagi data antara 2 saudara kandung. (Saya menguji ini hanya di Angular 5 )
Di dalam template komponen induk Anda:
app-sibling2.component.ts
sumber
Ada pembahasan tentang itu di sini.
https://github.com/angular/angular.io/issues/2663
Jawaban Alex J bagus tetapi tidak lagi berfungsi dengan Angular 4 saat ini mulai Juli 2017.
Dan tautan plunker ini akan mendemonstrasikan cara berkomunikasi antar saudara menggunakan layanan bersama dan dapat diamati.
https://embed.plnkr.co/P8xCEwSKgcOg07pwDrlO/
sumber
Sebuah arahan dapat masuk akal dalam situasi tertentu untuk 'menghubungkan' komponen. Faktanya hal-hal yang terhubung bahkan tidak perlu komponen lengkap, dan terkadang lebih ringan dan sebenarnya lebih sederhana jika tidak.
Misalnya saya punya
Youtube Player
komponen (membungkus Youtube API) dan saya ingin beberapa tombol pengontrol untuk itu. Satu-satunya alasan tombol bukan bagian dari komponen utama saya adalah karena tombol tersebut berada di tempat lain di DOM.Dalam hal ini sebenarnya hanya komponen 'ekstensi' yang hanya akan digunakan dengan komponen 'induk'. Saya mengatakan 'orang tua', tetapi di DOM itu adalah saudara - jadi sebut saja sesuka Anda.
Seperti yang saya katakan itu bahkan tidak perlu menjadi komponen lengkap, dalam kasus saya itu hanya
<button>
(tapi bisa jadi komponen).Dalam HTML untuk
ProductPage.component
, di manayoutube-player
jelas komponen saya yang membungkus API Youtube.Direktif menghubungkan semuanya untuk saya, dan saya tidak perlu mendeklarasikan event (click) di HTML.
Jadi direktif dapat terhubung dengan baik ke pemutar video tanpa harus terlibat
ProductPage
sebagai mediator.Ini adalah pertama kalinya saya benar-benar melakukan ini, jadi belum yakin seberapa skalabelnya untuk situasi yang jauh lebih kompleks. Untuk ini, saya senang dan meninggalkan HTML saya sederhana dan tanggung jawab atas segalanya berbeda.
sumber
player
. Jika saya meninggalkan penyebutan pertama pemain saya mendapatkan rangeError. Saya bingung bagaimana ini seharusnya bekerja._player
untuk bidang pribadi yang mewakili pemain, jadi ya Anda akan mendapatkan kesalahan jika Anda menyalin ini dengan tepat. Akan diperbarui. Maaf!Berikut adalah penjelasan praktis sederhana: Dijelaskan secara sederhana di sini
Di call.service.ts
Komponen dari mana Anda ingin memanggil observable untuk menginformasikan komponen lain bahwa tombol diklik
Komponen tempat Anda ingin melakukan tindakan pada tombol yang diklik pada komponen lain
Pemahaman saya jelas tentang komunikasi komponen dengan membaca ini: http://musttoknow.com/angular-4-angular-5-communicate-two-components-using-observable-subject/
sumber
Layanan bersama adalah solusi yang baik untuk masalah ini. Jika Anda ingin menyimpan beberapa informasi aktivitas juga, Anda dapat menambahkan Layanan Bersama ke daftar penyedia modul utama (app.module) Anda.
Kemudian Anda bisa langsung menyediakannya ke komponen Anda,
Dengan Layanan Bersama, Anda dapat menggunakan fungsi atau membuat Subjek untuk memperbarui beberapa tempat sekaligus.
Dalam komponen daftar Anda, Anda dapat menerbitkan informasi item yang diklik,
lalu Anda dapat mengambil informasi ini di komponen detail Anda:
Jelasnya, data yang mencantumkan daftar komponen dapat berupa apa saja. Semoga ini membantu.
sumber
Anda perlu menyiapkan hubungan induk-anak antara komponen Anda. Masalahnya adalah Anda mungkin hanya memasukkan komponen anak dalam konstruktor komponen induk dan menyimpannya dalam variabel lokal. Sebagai gantinya, Anda harus mendeklarasikan komponen anak dalam komponen induk Anda dengan menggunakan
@ViewChild
deklarator properti. Seperti inilah tampilan komponen induk Anda:https://angular.io/docs/ts/latest/api/core/index/ViewChild-var.html
https://angular.io/docs/ts/latest/cookbook/component-communication.html#parent-to-view-child
Hati-hati, komponen anak tidak akan tersedia dalam konstruktor komponen induk, tepat setelah
ngAfterViewInit
hook siklus hidup dipanggil. Untuk menangkap pengait ini, implementasikanAfterViewInit
antarmuka di kelas induk Anda dengan cara yang sama seperti yang Anda lakukanOnInit
.Tapi, ada deklarator properti lain seperti yang dijelaskan dalam catatan blog ini: http://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders/
sumber
Subjek perilaku. Saya menulis blog tentang itu.
Dalam contoh ini saya mendeklarasikan subjek perilaku noid tipe nomor. Juga dapat diamati. Dan jika "sesuatu terjadi" ini akan berubah dengan fungsi baru () {}.
Jadi, dalam komponen sibling, satu akan memanggil fungsi, untuk melakukan perubahan, dan yang lainnya akan terpengaruh oleh perubahan itu, atau sebaliknya.
Misalnya, saya mendapatkan id dari URL dan memperbarui noid dari subjek perilaku.
Dan dari sisi lain, saya dapat menanyakan apakah ID itu "apa pun yang saya inginkan" dan membuat pilihan setelah itu, dalam kasus saya jika saya ingin menghapus tugas, dan tugas itu adalah url saat ini, ia harus mengarahkan saya ke rumah:
sumber
Ini sebenarnya bukan yang Anda inginkan tetapi yang pasti akan membantu Anda
Saya terkejut tidak ada lebih banyak informasi di luar sana tentang komunikasi komponen <=> pertimbangkan tutorial ini oleh angualr2
Untuk komunikasi komponen saudara, saya sarankan untuk pergi bersama
sharedService
. Ada juga opsi lain yang tersedia.Silakan merujuk ke tautan di atas untuk kode lebih lanjut.
Sunting: Ini adalah demo yang sangat kecil. Anda sudah menyebutkan bahwa Anda sudah mencoba dengan
sharedService
. Jadi mohon pertimbangkan tutorial ini oleh angualr2 untuk informasi lebih lanjut.sumber
Saya telah menurunkan metode penyetel dari induk ke salah satu anaknya melalui pengikatan, memanggil metode itu dengan data dari komponen anak, yang berarti bahwa komponen induk diperbarui dan kemudian dapat memperbarui komponen anak keduanya dengan data baru. Itu memang membutuhkan pengikatan 'ini' atau menggunakan fungsi panah.
Ini memiliki keuntungan bahwa anak-anak tidak begitu terikat satu sama lain karena mereka tidak membutuhkan layanan bersama yang spesifik.
Saya tidak sepenuhnya yakin bahwa ini adalah praktik terbaik, akan menarik untuk mendengar pandangan orang lain tentang ini.
sumber