AngularJS memiliki & parameter di mana Anda bisa meneruskan panggilan balik ke arahan (misalnya cara panggilan balik AngularJS . Apakah mungkin untuk meneruskan panggilan balik sebagai @Input
untuk Komponen Angular (seperti di bawah ini)? Jika tidak, apa yang akan menjadi hal terdekat dengan apa AngularJS tidak?
@Component({
selector: 'suggestion-menu',
providers: [SuggestService],
template: `
<div (mousedown)="suggestionWasClicked(suggestion)">
</div>`,
changeDetection: ChangeDetectionStrategy.Default
})
export class SuggestionMenuComponent {
@Input() callback: Function;
suggestionWasClicked(clickedEntry: SomeModel): void {
this.callback(clickedEntry, this.query);
}
}
<suggestion-menu callback="insertSuggestion">
</suggestion-menu>
angularjs
angular
typescript
Michail Michailidis
sumber
sumber
@Input
cara yang disarankan membuat spagetti kode saya dan tidak mudah dipelihara ..@Output
s adalah cara yang jauh lebih alami untuk melakukan apa yang saya inginkan. Akibatnya saya mengubah jawaban yang diterimaJawaban:
Saya pikir itu solusi yang buruk. Jika Anda ingin memasukkan Fungsi ke dalam komponen
@Input()
,@Output()
dekorator adalah yang Anda cari.sumber
@Output
danEventEmitter
. Jadi, di sini adalah dokumentasi Angular untuk @Output bagi mereka yang tertarik.MEMPERBARUI
Jawaban ini diajukan ketika Angular 2 masih dalam alfa dan banyak fitur tidak tersedia / tidak terdokumentasi. Meskipun di bawah ini masih berfungsi, metode ini sekarang sepenuhnya usang. Saya sangat merekomendasikan jawaban yang diterima di bawah ini.
Jawaban Asli
Ya pada kenyataannya, namun Anda ingin memastikan bahwa itu dicakup dengan benar. Untuk ini saya telah menggunakan properti untuk memastikan itu
this
berarti apa yang saya inginkan.sumber
Parent -> Child
ngOnInit
Saya hanya akan menggunakan:this.theCallback = this.theCallback.bind(this)
dan kemudian Anda dapat menyampaikantheCallback
bukantheBoundCallback
.Alternatif jawaban yang diberikan SnareChops.
Anda dapat menggunakan .bind (ini) di templat Anda untuk memiliki efek yang sama. Mungkin tidak bersih tetapi menghemat beberapa baris. Saya saat ini pada sudut 2.4.0
sumber
@Input
menyebabkan kode menjadi spaghetti dan menggunakan@Output
hasil dalam proses yang lebih alami / tidak teruraiDalam beberapa kasus, Anda mungkin perlu logika bisnis dilakukan oleh komponen induk. Dalam contoh di bawah ini kami memiliki komponen turunan yang merender baris tabel bergantung pada logika yang disediakan oleh komponen induk:
Jadi, saya ingin menunjukkan 2 hal di sini:
sumber
.bind(this)
[getRowColor]="getColor"
dan tidak[getRowColor]="getColor()"
;-)Sebagai contoh, saya menggunakan jendela modal masuk, di mana jendela modal adalah orangtua, formulir login adalah anak dan tombol masuk memanggil kembali ke fungsi tutup modal induk.
Modal induk berisi fungsi untuk menutup modal. Orang tua ini meneruskan fungsi tutup ke komponen anak login.
Setelah komponen login anak mengirimkan formulir login, itu menutup modal induk menggunakan fungsi panggilan balik orangtua
sumber
Alternatif jawaban yang diberikan Max Fahl.
Anda dapat mendefinisikan fungsi panggilan balik sebagai fungsi panah di komponen induk sehingga Anda tidak perlu mengikatnya.
sumber
Melewati metode dengan argumen, menggunakan .bind di dalam template
sumber
Gunakan pola yang bisa diamati. Anda dapat memasukkan nilai yang Dapat Diamati (bukan Subjek) ke dalam parameter Input dan mengelolanya dari komponen induk. Anda tidak perlu fungsi panggilan balik.
Lihat contoh: https://stackoverflow.com/a/49662611/4604351
sumber
Alternatif lain.
OP menanyakan cara untuk menggunakan panggilan balik. Dalam hal ini ia merujuk secara khusus ke fungsi yang memproses suatu peristiwa (dalam contohnya: peristiwa klik), yang akan diperlakukan sebagai jawaban yang diterima dari @serginho menyarankan: dengan
@Output
danEventEmitter
.Namun, ada perbedaan antara panggilan balik dan peristiwa: Dengan panggilan balik komponen anak Anda dapat mengambil beberapa umpan balik atau informasi dari orang tua, tetapi suatu peristiwa hanya dapat menginformasikan bahwa sesuatu terjadi tanpa mengharapkan umpan balik.
Ada kasus penggunaan di mana umpan balik diperlukan, mis. dapatkan warna, atau daftar elemen yang perlu ditangani oleh komponen. Anda dapat menggunakan fungsi terikat seperti yang disarankan beberapa jawaban, atau Anda dapat menggunakan antarmuka (itu selalu merupakan preferensi saya).
Contoh
Misalkan Anda memiliki komponen generik yang beroperasi di atas daftar elemen {id, name} yang ingin Anda gunakan dengan semua tabel database Anda yang memiliki bidang ini. Komponen ini harus:
Komponen Anak
Dengan menggunakan penjilidan normal kita membutuhkan 1
@Input()
dan 3@Output()
parameter (tetapi tanpa umpan balik dari orang tua). Ex.<list-ctrl [items]="list" (itemClicked)="click($event)" (itemRemoved)="removeItem($event)" (loadNextPage)="load($event)" ...>
, tetapi membuat antarmuka, kita hanya perlu satu@Input()
:Komponen Induk
Sekarang kita dapat menggunakan komponen daftar di induk.
Perhatikan bahwa
<list-ctrl>
menerimathis
(komponen induk) sebagai objek panggilan balik. Satu keuntungan tambahan adalah tidak diperlukan untuk mengirimkan instance induk, itu bisa berupa layanan atau objek apa pun yang mengimplementasikan antarmuka jika use case Anda mengizinkannya.Contoh lengkap ada di stackblitz ini .
sumber
Jawaban saat ini dapat disederhanakan untuk ...
sumber
.bind(this)
makathis
dalam callback akanwindow
yang mungkin tidak peduli tergantung pada kasus penggunaan Anda. Namun jika Anda memilikithis
panggilan balik sama sekali, maka.bind(this)
perlu. Jika Anda tidak melakukannya, maka versi yang disederhanakan ini adalah caranya.this
fungsi callback di dalam. Itu hanya rawan kesalahan.