Zamiast wstrzykiwania ElementRef
i używania querySelector
lub stamtąd stamtąd można zastosować deklaratywny sposób, aby uzyskać bezpośredni dostęp do elementów w widoku:
<input #myname>
@ViewChild('myname') input;
element
ngAfterViewInit() {
console.log(this.input.nativeElement.value);
}
Przykład StackBlitz
- @ViewChild () obsługuje dyrektywę lub typ komponentu jako parametr lub nazwę (ciąg) zmiennej szablonu.
- @ViewChildren () obsługuje również listę nazw jako listę oddzieloną przecinkami (obecnie nie można używać spacji
@ViewChildren('var1,var2,var3')
).
- @ContentChild () i @ContentChildren () robią to samo, ale w lekkim DOM (
<ng-content>
rzutowane elementy).
potomków
@ContentChildren()
jest jedynym, który pozwala również wyszukiwać potomków
@ContentChildren(SomeTypeOrVarName, {descendants: true}) someField;
{descendants: true}
powinien być domyślny, ale nie jest w wersji 2.0.0 końcowej i jest uważany za błąd
Zostało to naprawione w wersji 2.0.1
czytać
Jeśli istnieje komponent i dyrektywy, read
parametr pozwala określić, która instancja ma zostać zwrócona.
Na przykład ViewContainerRef
jest to wymagane przez dynamicznie tworzone komponenty zamiast domyślnychElementRef
@ViewChild('myname', { read: ViewContainerRef }) target;
subskrybuj zmiany
Mimo że elementy potomne widoku są ustawiane tylko wtedy, gdy ngAfterViewInit()
są wywoływane, a elementy potomne treści są ustawiane tylko wtedy, gdy ngAfterContentInit()
są wywoływane, jeśli chcesz zasubskrybować zmiany wyniku zapytania, należy to zrobić wngOnInit()
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));
}
bezpośredni dostęp do DOM
może wyszukiwać tylko elementy DOM, ale nie instancje komponentów lub dyrektyw:
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);
}
}
uzyskać dowolną wyświetlaną treść
Zobacz Dostęp do treści zastrzeżonych