Zamiast wstrzykiwania ElementRefi używania querySelectorlub 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, readparametr pozwala określić, która instancja ma zostać zwrócona.
Na przykład ViewContainerRefjest 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