Saya memiliki dua komponen sebagai berikut dan saya ingin memanggil fungsi dari komponen lain. Kedua komponen termasuk dalam komponen induk ketiga menggunakan direktif.
Komponen 1:
@component(
selector:'com1'
)
export class com1{
function1(){...}
}
Komponen 2:
@component(
selector:'com2'
)
export class com2{
function2(){...
// i want to call function 1 from com1 here
}
}
Saya sudah mencoba menggunakan @input
dan @output
tetapi saya tidak mengerti persis bagaimana menggunakannya dan bagaimana memanggil fungsi itu, ada yang bisa membantu?
angular
angular2-components
noobProgrammer
sumber
sumber
Jawaban:
Jika com1 dan com2 adalah saudara kandung yang dapat Anda gunakan
com2 memancarkan acara menggunakan
EventEmitter
Di sini komponen induk menambahkan acara yang mengikat untuk mendengarkan
myEvent
acara dan kemudian memanggilcom1.function1()
ketika peristiwa seperti itu terjadi.#com1
adalah variabel templat yang memungkinkan untuk merujuk ke elemen ini dari tempat lain di templat. Kami menggunakan ini untuk membuatfunction1()
event handler untukmyEvent
daricom2
:Untuk opsi lain untuk berkomunikasi antar komponen, lihat juga interaksi komponen
sumber
<sibling1 (myEvent)="...">
adalah acara yang mengikat untuk orang tua / host, karena itulah satu-satunya cara yang disediakan Angular. Namun event handler memanggil metode pada saudara lain (com1
). Orang tua digunakan sebagai mediator.somecomponent.ts
?Pertama, apa yang Anda butuhkan untuk memahami hubungan antar komponen. Kemudian Anda dapat memilih metode komunikasi yang tepat. Saya akan mencoba menjelaskan semua metode yang saya tahu dan gunakan dalam praktik saya untuk komunikasi antar komponen.
Hubungan macam apa yang bisa terjadi antar komponen?
1. Induk> Anak
Berbagi Data melalui Input
Ini mungkin metode berbagi data yang paling umum. Ini bekerja dengan menggunakan
@Input()
dekorator untuk memungkinkan data dikirimkan melalui templat.parent.component.ts
child.component.ts
Ini adalah metode yang sangat sederhana. Mudah digunakan. Kami juga dapat menangkap perubahan pada data dalam komponen anak menggunakan ngOnChanges .
Tetapi jangan lupa bahwa jika kita menggunakan objek sebagai data dan mengubah parameter objek ini, referensi untuk itu tidak akan berubah. Oleh karena itu, jika kita ingin menerima objek yang dimodifikasi dalam komponen anak, itu harus tidak berubah.
2. Anak> Orangtua
Berbagi Data melalui ViewChild
ViewChild memungkinkan satu komponen untuk disuntikkan ke yang lain, memberikan orang tua akses ke atribut dan fungsinya. Satu peringatan, bagaimanapun, adalah bahwa
child
tidak akan tersedia sampai setelah tampilan diinisialisasi. Ini berarti kita perlu mengimplementasikan kait siklus hidup AfterViewInit untuk menerima data dari anak.parent.component.ts
child.component.ts
Berbagi Data melalui Output () dan EventEmitter
Cara lain untuk berbagi data adalah dengan memancarkan data dari anak, yang dapat didaftar oleh orang tua. Pendekatan ini sangat ideal ketika Anda ingin berbagi perubahan data yang terjadi pada hal-hal seperti klik tombol, entri formulir, dan acara pengguna lainnya.
parent.component.ts
child.component.ts
3. Saudara kandung
Anak> Orangtua> Anak
Saya mencoba menjelaskan cara lain untuk berkomunikasi antara saudara kandung di bawah ini. Tetapi Anda sudah bisa memahami salah satu cara memahami metode di atas.
parent.component.ts
child-one.component.ts
child-two.component.ts
4. Komponen Yang Tidak Terkait
Semua metode yang saya jelaskan di bawah ini dapat digunakan untuk semua opsi di atas untuk hubungan antar komponen. Tetapi masing-masing memiliki kelebihan dan kekurangan.
Berbagi Data dengan Layanan
Saat mengirimkan data antar komponen yang tidak memiliki koneksi langsung, seperti saudara kandung, cucu, dll, Anda harus menggunakan layanan bersama. Ketika Anda memiliki data yang harus selalu disinkronkan, saya menemukan bahwa RxJS BehaviorSubject sangat berguna dalam situasi ini.
data.service.ts
first.component.ts
second.component.ts
Berbagi Data dengan Rute
Terkadang Anda tidak hanya perlu mengirimkan data sederhana antar komponen tetapi juga menyimpan beberapa kondisi halaman. Misalnya, kami ingin menyimpan beberapa filter di pasar online dan kemudian menyalin tautan ini dan mengirim ke teman. Dan kami berharap untuk membuka halaman dalam kondisi yang sama seperti kami. Cara pertama, dan mungkin yang tercepat, untuk melakukan ini adalah dengan menggunakan parameter kueri .
Parameter kueri terlihat lebih di sepanjang garis di
/people?id=
manaid
dapat sama dengan apa pun dan Anda dapat memiliki parameter sebanyak yang Anda inginkan. Parameter kueri akan dipisahkan oleh karakter ampersand.Saat bekerja dengan parameter kueri, Anda tidak perlu mendefinisikannya dalam file rute Anda, dan mereka bisa dinamai parameter. Misalnya, ambil kode berikut:
page1.component.ts
Di halaman penerimaan, Anda akan menerima parameter kueri ini seperti berikut:
page2.component.ts
NgRx
Cara terakhir, yang lebih rumit tetapi lebih kuat, adalah menggunakan NgRx . Perpustakaan ini bukan untuk berbagi data; itu adalah perpustakaan manajemen negara yang kuat. Dalam contoh singkat saya tidak dapat menjelaskan cara menggunakannya, tetapi Anda dapat mengunjungi situs resmi dan membaca dokumentasi tentangnya.
Bagi saya, NgRx Store memecahkan banyak masalah. Misalnya, ketika Anda harus berurusan dengan yang dapat diobservasi dan ketika tanggung jawab untuk beberapa data yang dapat diamati dibagi antara komponen yang berbeda, tindakan toko dan peredam memastikan bahwa modifikasi data akan selalu dilakukan "dengan cara yang benar".
Ini juga menyediakan solusi yang andal untuk caching permintaan HTTP. Anda akan dapat menyimpan permintaan dan responsnya sehingga Anda dapat memverifikasi bahwa permintaan yang Anda buat belum memiliki respons tersimpan.
Anda dapat membaca tentang NgRx dan memahami apakah Anda membutuhkannya di aplikasi Anda atau tidak:
Akhirnya, saya ingin mengatakan bahwa sebelum memilih beberapa metode untuk berbagi data, Anda perlu memahami bagaimana data ini akan digunakan di masa depan. Maksud saya mungkin barusan Anda hanya dapat menggunakan
@Input
dekorator untuk berbagi nama pengguna dan nama keluarga. Kemudian Anda akan menambahkan komponen baru atau modul baru (misalnya, panel admin) yang membutuhkan informasi lebih lanjut tentang pengguna. Ini berarti bahwa mungkin cara yang lebih baik untuk menggunakan layanan untuk data pengguna atau cara lain untuk berbagi data. Anda harus lebih memikirkannya sebelum mulai menerapkan berbagi data.sumber
Anda dapat mengakses metode komponen seseorang dari komponen dua ..
satu komponen
komponenDua
file componentTwo html
sumber
Komponen 1 (anak):
Komponen 2 (induk):
sumber
@ViewChild
yang bekerja untuk saya. Terima kasih untuk contoh ini.Itu tergantung pada hubungan antara komponen Anda (orang tua / anak) tetapi cara terbaik / umum untuk membuat komponen berkomunikasi adalah dengan menggunakan layanan bersama.
Lihat dokumen ini untuk lebih jelasnya:
Yang sedang berkata, Anda bisa menggunakan yang berikut ini untuk memberikan instance dari com1 ke com2:
Di com2, Anda dapat menggunakan yang berikut ini:
sumber
@Input
di lapangan?<button (click)="dbgraph.displayTableGraph()">Graph</button> <dbstats-graph #dbgraph></dbstats-graph>
Perhatikan variabel lokal
#dbgraph
pada komponen anak, yang dapat digunakan orang tua untuk mengakses metodenya (dbgraph.displayTableGraph()
).sumber
Menggunakan Dataservice kita dapat memanggil fungsi dari komponen lain
Component1: Komponen yang kita panggil fungsi
dataervice.ts
Component2: Komponen yang berisi fungsi
sumber
if ( this.bookmarkRoot.callToggle.observers.length === 0 ) { this.bookmarkRoot.callToggle.subscribe(( data ) => { this.closeDrawer(); } ) }