Alih-alih menyuntikkan ElementRef
dan menggunakan querySelector
atau serupa dari sana, cara deklaratif dapat digunakan sebagai gantinya untuk mengakses elemen dalam tampilan secara langsung:
<input #myname>
@ViewChild('myname') input;
elemen
ngAfterViewInit() {
console.log(this.input.nativeElement.value);
}
Contoh StackBlitz
- @ViewChild () mendukung direktif atau tipe komponen sebagai parameter, atau nama (string) dari variabel templat.
- @ViewChildren () juga mendukung daftar nama sebagai daftar yang dipisahkan koma (saat ini tidak ada spasi yang diizinkan
@ViewChildren('var1,var2,var3')
).
- @ContentChild () dan @ContentChildren () melakukan hal yang sama tetapi dalam cahaya DOM (
<ng-content>
elemen yang diproyeksikan).
keturunan
@ContentChildren()
adalah satu-satunya yang memungkinkan untuk meminta keturunan
@ContentChildren(SomeTypeOrVarName, {descendants: true}) someField;
{descendants: true}
seharusnya default tetapi bukan di 2.0.0 final dan itu dianggap bug.
Ini diperbaiki di 2.0.1
Baca
Jika ada komponen dan arahan, read
parameter memungkinkan untuk menentukan contoh mana yang harus dikembalikan.
Misalnya ViewContainerRef
yang diperlukan oleh komponen yang dibuat secara dinamis, bukan defaultElementRef
@ViewChild('myname', { read: ViewContainerRef }) target;
berlangganan perubahan
Meskipun tampilan anak-anak hanya diatur saat ngAfterViewInit()
dipanggil dan konten anak-anak hanya ditetapkan saat ngAfterContentInit()
dipanggil, jika Anda ingin berlangganan perubahan hasil permintaan, itu harus dilakukan dalamngOnInit()
https://github.com/angular/angular/issues/9689#issuecomment-229247134
@ViewChildren(SomeType) viewChildren;
@ContentChildren(SomeType) contentChildren;
ngOnInit() {
this.viewChildren.changes.subscribe(changes => console.log(changes));
this.contentChildren.changes.subscribe(changes => console.log(changes));
}
akses DOM langsung
hanya dapat meminta elemen DOM, tetapi tidak komponen atau instance direktif:
export class MyComponent {
constructor(private elRef:ElementRef) {}
ngAfterViewInit() {
var div = this.elRef.nativeElement.querySelector('div');
console.log(div);
}
// for transcluded content
ngAfterContentInit() {
var div = this.elRef.nativeElement.querySelector('div');
console.log(div);
}
}
dapatkan konten yang diproyeksikan sewenang-wenang
Lihat Mengakses konten yang ditransklusikan
input
juga merupakanElementRef
, tetapi Anda mendapatkan referensi ke elemen yang sebenarnya Anda inginkan, alih-alih menanyakannya dari hostElementRef
.ElementRef
tidak apa-apa. Juga menggunakanElementRef.nativeElement
denganRenderer
baik-baik saja. Yang tidak disarankan adalah mengakses propertiElementRef.nativeElement.xxx
secara langsung.ElementRef.nativeElement)
adalah, mencegah Anda dari menggunakan Angulars render sisi server dan fitur WebWorker (saya tidak tahu apakah itu juga istirahat mendatang secara offline Template compiler - tapi kurasa tidak).@ViewChild('myObj', { read: ElementRef }) myObj: ElementRef;
Anda bisa mendapatkan pegangan ke elemen DOM melalui
ElementRef
dengan menyuntikkannya ke konstruktor komponen Anda:Documents: https://angular.io/docs/ts/latest/api/core/index/ElementRef-class.html
sumber
ElementRef
hilang.ElementRef
tersedia (lagi?).this.element.nativeElement.querySelector('#someElementId')
dan meneruskan ElementRef ke konstruktor seperti ini ..private element: ElementRef,
Impor lib ...import { ElementRef } from '@angular/core';
Contoh diperbarui untuk bekerja dengan versi terbaru
Untuk detail lebih lanjut tentang elemen asli, di sini
sumber
Angular 4+ : Gunakan
renderer.selectRootElement
dengan pemilih CSS untuk mengakses elemen.Saya punya formulir yang awalnya menampilkan input email. Setelah email dimasukkan, formulir akan diperluas untuk memungkinkan mereka untuk terus menambahkan informasi yang berkaitan dengan proyek mereka. Namun, jika mereka bukan klien yang sudah ada, formulir akan menyertakan bagian alamat di atas bagian informasi proyek.
Sampai sekarang, bagian entri data belum dipecah menjadi komponen, sehingga bagian dikelola dengan arahan * ngIf. Saya perlu menetapkan fokus pada bidang catatan proyek jika mereka adalah klien yang sudah ada, atau bidang nama depan jika mereka baru.
Saya mencoba solusi tanpa hasil. Namun, Pembaruan 3 dalam jawaban ini memberi saya setengah dari solusi akhirnya. Setengah lainnya datang dari tanggapan MatteoNY di utas ini . Hasilnya adalah ini:
Karena satu-satunya hal yang saya lakukan adalah mengatur fokus pada elemen, saya tidak perlu khawatir dengan deteksi perubahan, jadi saya benar-benar dapat menjalankan panggilan ke
renderer.selectRootElement
luar Angular. Karena saya perlu memberi waktu pada bagian baru untuk dirender, bagian elemen dibungkus dengan batas waktu untuk memungkinkan waktu rendering thread untuk mengejar ketinggalan sebelum pemilihan elemen dilakukan. Setelah semua yang diatur, saya bisa memanggil elemen menggunakan pemilih CSS dasar.Saya tahu contoh ini terutama berkaitan dengan acara fokus, tetapi sulit bagi saya bahwa ini tidak dapat digunakan dalam konteks lain.
sumber
Untuk orang yang mencoba mengambil instance komponen di dalam
*ngIf
atau*ngSwitchCase
, Anda dapat mengikuti trik ini.Buat
init
arahan.Ekspor komponen Anda dengan nama seperti
myComponent
Gunakan templat ini untuk mendapatkan instance
ElementRef
ANDMyComponent
Gunakan kode ini dalam TypeScript
sumber
impor
ViewChild
dekorator@angular/core
, seperti:Kode HTML:
Kode TS:
sekarang Anda dapat menggunakan objek 'myForm' untuk mengakses elemen apa pun di dalamnya di dalam kelas.
Source
sumber
sumber
inputTxt
kasus tersebut.Catatan : ini tidak berlaku untuk sudut 6 dan di atas sebagai
ElementRef
menjadiElementRef<T>
denganT
yang menunjukkan jenisnativeElement
.Saya ingin menambahkan bahwa jika Anda menggunakan
ElementRef
, seperti yang direkomendasikan oleh semua jawaban, maka Anda akan segera menghadapi masalah yangElementRef
memiliki deklarasi tipe mengerikan yang terlihat sepertiini bodoh di lingkungan peramban tempat nativeElement adalah
HTMLElement
.Untuk mengatasinya, Anda dapat menggunakan teknik berikut
sumber
item
kebutuhan untuk menjadi ElementRef, meskipun Anda menetapkan ke ElementRef lain:let item:ElementRef, item2:ElementRef; item = item2; // no can do.
. Sangat membingungkan. Tapi ini bagus:let item:ElementRef, item2:ElementRef; item = item2.nativeElement
karena implementasi yang Anda tunjukkan.let item: ElementRef, item2: ElementRef; item = item2
gagal karena analisis tugas yang pasti. Kedua Anda gagal karena alasan yang sama tetapi keduanya berhasil jikaitem2
diinisialisasi karena alasan yang dibahas (atau sebagai pemeriksaan cepat yang berguna untuk penugasan yang dapat kami gunakan dideclare let
sini). Bagaimanapun juga, sungguh memalukan melihatany
API publik seperti ini.untuk mendapatkan saudara segera berikutnya, gunakan ini
sumber
Memilih elemen target dari daftar. Sangat mudah untuk memilih elemen tertentu dari daftar elemen yang sama.
kode komponen:
kode html:
kode css:
sumber
Contoh minimum untuk penggunaan cepat:
#inputEl
pada<input>
tag.ngAfterViewInit
kait siklus hidup.catatan:
Jika Anda ingin memanipulasi elemen DOM gunakan Renderer2 API alih-alih mengakses elemen secara langsung. Mengizinkan akses langsung ke DOM dapat membuat aplikasi Anda lebih rentan terhadap serangan XSS
sumber