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
input
jest równieżElementRef
, ale dostajesz odwołanie do elementu, którego faktycznie potrzebujesz, zamiast zapytania go z hostaElementRef
.ElementRef
jest w porządku. Również używanieElementRef.nativeElement
zRenderer
jest w porządku. Co jest odradzane jest dostęp do właściwościElementRef.nativeElement.xxx
bezpośrednio.ElementRef.nativeElement)
, uniemożliwia korzystanie z renderowania po stronie serwera Angulars i funkcji WebWorker (nie wiem, czy to również psuje nadchodzący kompilator szablonów offline - ale chyba nie).@ViewChild('myObj', { read: ElementRef }) myObj: ElementRef;
Możesz uzyskać uchwyt do elementu DOM poprzez
ElementRef
wstrzyknięcie go do konstruktora komponentu:Dokumenty: https://angular.io/docs/ts/latest/api/core/index/ElementRef-class.html
źródło
ElementRef
już go nie ma.ElementRef
jest dostępny (ponownie?).this.element.nativeElement.querySelector('#someElementId')
i przekazać ElementRef do konstruktora w ten sposób ..private element: ElementRef,
Importuj lib ...import { ElementRef } from '@angular/core';
Przykład zaktualizowany do pracy z najnowszą wersją
Aby uzyskać więcej informacji na temat elementu natywnego, tutaj
źródło
Angular 4+ : Użyj
renderer.selectRootElement
z selektorem CSS, aby uzyskać dostęp do elementu.Mam formularz, który początkowo wyświetla dane e-mail. Po wprowadzeniu wiadomości e-mail formularz zostanie rozwinięty, aby umożliwić im dalsze dodawanie informacji związanych z ich projektem. Jednakże, jeśli są one nie istniejącego klienta, forma będzie zawierać sekcję powyższy adres w sekcji informacji o projekcie.
Na razie część wprowadzania danych nie została podzielona na komponenty, więc sekcjami zarządza się dyrektywami * ngIf. Muszę skupić się na polu notatek projektowych, jeśli są istniejącym klientem, lub polu imienia, jeśli są nowi.
Próbowałem rozwiązań bez powodzenia. Jednak aktualizacja 3 w tej odpowiedzi dała mi połowę ostatecznego rozwiązania. Druga połowa pochodziła z odpowiedzi MatteoNY w tym wątku. Rezultat jest następujący:
Ponieważ jedyne, co robię, to skupianie się na elemencie, nie muszę się martwić wykrywaniem zmian, więc mogę uruchomić połączenie
renderer.selectRootElement
poza Angularem. Ponieważ muszę dać nowym sekcjom czas na wyrenderowanie, sekcja elementu jest zawijana w limicie czasu, aby pozwolić wątkom renderującym na nadrobienie zaległości przed próbą wyboru elementu. Po zakończeniu konfiguracji mogę po prostu wywołać element za pomocą podstawowych selektorów CSS.Wiem, że ten przykład dotyczył głównie zdarzenia skupienia, ale dla mnie ciężko jest, aby nie można go było użyć w innych kontekstach.
źródło
Dla ludzi, którzy próbują złapać instancję składnika wewnątrz
*ngIf
lub*ngSwitchCase
można śledzić tę sprawę.Utwórz
init
dyrektywę.Wyeksportuj komponent o nazwie takiej jak
myComponent
Użyj tego szablonu, aby uzyskać instancję
ElementRef
ANDMyComponent
Użyj tego kodu w TypeScript
źródło
zaimportuj
ViewChild
dekorator z@angular/core
:Kod HTML:
Kod TS:
teraz możesz użyć obiektu „myForm”, aby uzyskać dostęp do dowolnego elementu w klasie.
Source
źródło
źródło
inputTxt
w tym przypadku nieokreśloną wartość .Uwaga : to nie ma zastosowania do kątowego 6 i powyżej jako
ElementRef
stałaElementRef<T>
zT
oznaczeniem typunativeElement
.Chciałbym dodać, że jeśli używasz
ElementRef
, zgodnie z zaleceniami wszystkich odpowiedzi, natychmiast natkniesz się na problemElementRef
z okropną deklaracją typu, która wygląda jakjest to głupie w środowisku przeglądarki, w którym nativeElement jest
HTMLElement
.Aby obejść ten problem, możesz użyć następującej techniki
źródło
item
potrzeby być ElementRef, choć jesteś ustawienie go do innego ElementRef:let item:ElementRef, item2:ElementRef; item = item2; // no can do.
. Bardzo mylące. Ale to dobrze:let item:ElementRef, item2:ElementRef; item = item2.nativeElement
ze względu na implementację, którą wskazałeś.let item: ElementRef, item2: ElementRef; item = item2
kończy się niepowodzeniem z powodu określonej analizy przypisania. Druga próba kończy się niepowodzeniem z tych samych powodów, ale oba kończą się powodzeniem, jeśliitem2
zostały zainicjowane z omówionych powodów (lub jako przydatna szybka kontrola możliwości przypisania, którą możemy wykorzystaćdeclare let
tutaj). Niezależnie od tego, naprawdę szkoda zobaczyćany
takie publiczne API.aby uzyskać najbliższe następne rodzeństwo, użyj tego
źródło
Wybieranie elementu docelowego z listy. Łatwo jest wybrać konkretny element z listy tych samych elementów.
kod komponentu:
Kod HTML:
kod css:
źródło
Minimalny przykład szybkiego użycia:
#inputEl
to<input>
tag.ngAfterViewInit
haku cyklu życia.Uwaga:
Jeśli chcesz manipulować elementami DOM, użyj interfejsu API Renderer2 zamiast bezpośredniego dostępu do elementów. Zezwolenie na bezpośredni dostęp do DOM może zwiększyć podatność aplikacji na ataki XSS
źródło