Tidak, ini bukan pertanyaan duplikat. Soalnya, ada banyak pertanyaan dan masalah di SO dan Github yang meresepkan bahwa saya menambahkan arahan ini ke tag yang memiliki [(ngModel)]
arahan dan tidak terkandung dalam formulir. Jika saya tidak menambahkannya, saya mendapatkan kesalahan:
ERROR Error: No value accessor for form control with unspecified name attribute
Oke, kesalahan hilang jika saya meletakkan atribut ini di sana. Tapi tunggu! Tidak ada yang tahu apa fungsinya! Dan dokter Angular tidak menyebutkannya sama sekali. Mengapa saya membutuhkan pengakses nilai ketika saya tahu bahwa saya tidak membutuhkannya? Bagaimana atribut ini terhubung ke pengakses nilai? Apa yang dilakukan arahan ini? Apa itu pengakses nilai dan bagaimana cara menggunakannya?
Dan mengapa setiap orang terus melakukan hal-hal yang sama sekali tidak mereka mengerti? Tambahkan saja baris kode ini dan berhasil, terima kasih, ini bukan cara untuk menulis program yang bagus.
Lalu. Saya membaca bukan hanya satu tapi dua panduan besar tentang bentuk di Angular dan bagian tentang ngModel
:
- https://angular.io/guide/forms
- https://angular.io/guide/reactive-forms
- https://angular.io/guide/template-syntax#ngModel
Dan tahukah Anda? Tidak satu pun penyebutan pengakses nilai atau ngDefaultControl
. Dimana itu?
sumber
Jawaban:
[ngDefaultControl]
Kontrol pihak ketiga membutuhkan a
ControlValueAccessor
berfungsi dengan bentuk sudut. Banyak dari mereka, seperti Polymer<paper-input>
, berperilaku seperti<input>
elemen asli dan dengan demikian dapat menggunakanDefaultValueAccessor
. MenambahkanngDefaultControl
atribut akan memungkinkan mereka menggunakan arahan itu.atau
Jadi inilah alasan utama mengapa atribut ini diperkenalkan.
Itu disebut
ng-default-control
atribut dalam versi alfa angular2 .Jadi
ngDefaultControl
adalah salah satu pemilih untuk direktif DefaultValueAccessor :Apa artinya?
Artinya kita dapat menerapkan atribut ini ke elemen (seperti komponen polimer) yang tidak memiliki pengakses nilainya sendiri. Jadi elemen ini akan mengambil perilaku
DefaultValueAccessor
dan kita dapat menggunakan elemen ini dengan bentuk sudut.Jika tidak, Anda harus menyediakan implementasi Anda sendiri
ControlValueAccessor
ControlValueAccessor
Status dokumen sudut
Mari tulis template berikut dalam aplikasi angular2 sederhana:
Untuk memahami bagaimana
input
perilaku kita di atas, kita perlu mengetahui arahan mana yang diterapkan pada elemen ini. Di sini angular memberikan beberapa petunjuk dengan kesalahan:Oke, kita bisa buka SO dan dapatkan jawabannya: import
FormsModule
to your@NgModule
:Kami mengimpornya dan semua bekerja sebagaimana mestinya. Tapi apa yang terjadi di balik terpal?
FormsModule mengekspor untuk kita arahan berikut:
Setelah beberapa penyelidikan kita dapat menemukan bahwa tiga arahan akan diterapkan pada kita
input
1) NgControlStatus
2) NgModel
3) DEFAULT_VALUE_ACCESSOR
NgControlStatus
direktif hanya memanipulasi kelas seperting-valid
,ng-touched
,ng-dirty
dan kita dapat menghilangkan sini.DefaultValueAccesstor
menyediakanNG_VALUE_ACCESSOR
token dalam array penyedia:NgModel
direktif memasukkanNG_VALUE_ACCESSOR
token konstruktor yang dideklarasikan pada elemen host yang sama.Dalam kasus kami
NgModel
akan menyuntikkanDefaultValueAccessor
. Dan sekarang direktif NgModel memanggilsetUpControl
fungsi bersama :Dan inilah jembatan yang sedang beraksi:
NgModel
mengatur kontrol (1) dandir.valueAccessor !.registerOnChange
metode panggilan .ControlValueAccessor
menyimpan callback dalam propertionChange
(2) dan mengaktifkan callback ini ketikainput
peristiwa terjadi (3) . Dan akhirnyaupdateControl
fungsi dipanggil di dalam callback (4)di mana panggilan sudut membentuk API
control.setValue
.Itu adalah versi singkat dari cara kerjanya.
sumber
@Input() ngModel
dan@Output() ngModelChange
untuk pengikatan dua arah dan saya pikir itu harus cukup jembatan. Sepertinya melakukan hal yang sama dengan cara yang sama sekali berbeda. Mungkin saya tidak harus memberi nama bidang sayangModel
?@Input() value; @Output() valueChange: EventEmitter<any> = new EventEmitter();
dan kemudian gunakan saja[(value)]="someProp"
ngModel
dan Angular mulai membuat kesalahan pada saya dan meminta dengan ControlValueAccessor.