Pertimbangkan komponen berikut:
@Component({
selector: 'app-test'
template: 'Hello!'
}}
export class TestComponent {
@Output() readonly selectionChange = new EventEmitter<SomeTypeHere>();
}
Dengan telepon:
<app-test (selectedChange)="selectedChangeHandler($event)"></app-test>
Perhatikan bahwa saya telah menulis selectedChange
alih-alih nama output yang benar selectionChange
. Sudut 9 dengan bendera strictTemplates
diaktifkan tidak membantu saya sama sekali. Gagal dalam diam. Bagian yang menarik adalah bahwa jika saya melakukan hal yang sama untuk @Input
, aplikasi menangkap kesalahan dan tidak dapat dikompilasi.
Apakah ada cara untuk melempar kesalahan jika saya mencoba "mendengarkan" yang tidak ada @Output
?
angular
angular-directive
angular9
dev_054
sumber
sumber
@Output()
lib bersama, atau bahkan pada aplikasi dan lupa untuk menghapus panggilan ... dan karena kami tidak memiliki kesalahan kompilasi, seperti yang kami miliki@Input()
, kami tidak dapat menemukan apa yang menyebabkan masalah tertentu (atau bahkan untuk tidak menyimpan sampah dalam kode). Tes unit dapat bermanfaat? Mungkin, tetapi pada saat itu belum memungkinkan karena waktu.Jawaban:
Tidak ada kesalahan dilemparkan karena acara yang mengikat di sudut digunakan tidak hanya dengan
@Output
s danEventEmitter
s, tetapi juga untuk mendengarkan peristiwa DOM seperticlick
,keyup
, dll Bahkan bisa digunakan untuk mendengarkan acara adat . Misalnya, jika Anda membuat dan memancarkan acara khusus di komponen turunan:Kemudian di komponen induk Anda dapat menangkapnya dengan namanya:
Angular menggunakan target.addEventListener (tipe, listener [, opsi]); secara internal (Anda dapat memastikannya melihat tautan di bawah), di mana
type
ada string.Itu sebabnya ia tidak membuang pengecualian jika tidak menemukan yang cocok
@Output
.dengarkanToElementOutputs
DefaultDomRenderer2.listen
EventManager.addEventListener
DomEventsPlugin.addEventListener
sumber
@Input()
(ingat bahwa Masukan memiliki karakteristik yang sama: bisa menjadi sesuatu global sepertidisabled
,id
, dll) sudut melemparkan kesalahan? Mengapa ini berhasil@Input
, tetapi tidak untuk@Output
? Juga, saya mencoba menemukan cara untuk memperingatkan / melempar kesalahan jika tidak@Output
ada yang berlalu.addEventListener
(saya akan menambahkan beberapa tautan ke jawaban saya untuk menunjukkannya). Saya pikir, itu dilakukan dengan sengaja, sehingga pengembang dapat menggunakan acara yang mengikat dengan acara khusus mereka sendiri. Saya percaya tidak ada cara untuk menonaktifkan perilaku ini pada waktu kompilasi. Meskipun beberapa IDE (seperti IntelliJ Idea) dapat menyoroti tempat-tempat tersebut dan menampilkan peringatan.[attr.any-attribute]
, dalam hal ini tidak ada kesalahan yang akan terjadi.Tidak ada solusi langsung untuk masalah Anda, namun beberapa kasus dapat dicakup.
click
acara tombol maka Anda dapat menjadikannya bagian dari pemilih yaituselector: 'app-test[selectionChange]'
. Anda juga dapat melakukan ini misalnya:selector: 'app-test[selectionChange]', app-test[click]'
artinyaclick
atauselectionChange
diperlukan.selectionChange
untukselectedChange
maka Anda dapat menggunakan pemilih ini:selector: 'app-test:not([selectionChange])'
untuk memaksa pengguna memperbarui.sumber
Jika Anda menggunakan Kode VS, Anda dapat menginstal ekstensi ini: Layanan Bahasa Angular akan memberikan peringatan ketika metode atau properti tidak didefinisikan. Ekstensi ini berfungsi baik dengan, output dan input (dan attrs, dll ...).
sumber
@Output
, Layanan Bahasa Angular tidak membantu apa-apa. Beri tahu saya jika Anda membutuhkan saya untuk mengklarifikasi pertanyaan.@Output
Anda akan melihat pesan kesalahan yang sama.