2016-06-18 8 views
7

Czytałem kilka artykułów na temat pułapek Angular 2, a czego unikać, jedna z tych rzeczy dotyczy braku bezpośredniego dostępu do DOM.Jak zdobyć/ustawić/usunąć atrybut elementu w Angular 2, używając "drogi kątowej"?

Zauważyłem, że Renderer jest bardzo przydatny, ponieważ zawiera pewne metody, które mogą pomóc uniknąć pułapki DOM. Jednak zauważyłem, że nie zawiera on żadnych funkcji, tylko , takich jak setElementAttribute, setElementClass i tak dalej.

Moje pytanie jest więc dość proste, w jaki sposób korzystasz z powyższych funkcji, ale jako wersja get i ? Czy żyją w innej klasie lub na przykład, w jaki sposób pracujesz przy pobieraniu atrybutów lub klas?

Odpowiedz

7

Angular2 nie zapewnia żadnej pomocy w uzyskaniu czegokolwiek z DOM z wyjątkiem ElementRef i zdarzeń.
Sposób Angular2 polega na utrzymaniu stanu w modelu i zaktualizowaniu modelu DOM w celu odzwierciedlenia tego stanu.

Jeśli potrzebujesz czytać z DOM, możesz użyć bezpośredniego dostępu do DOM lub niestandardowego Renderer, który zapewnia brakujące funkcje w domyślnej Renderer.

Przykłady zwyczaju renderujących

+0

Czy istnieje sposób na przedłużenie Renderera? I czy to byłby dobry pomysł? A może lepiej byłoby stworzyć całkowicie niestandardowy? – Chrillewoodz

+0

Jeszcze nie przyjrzałem się "Rendererowi", ale jestem pewien, że rozszerzenie to dobry pomysł. –

+0

Ok, będę musiał rzucić okiem. Istnieje jednak jeden scenariusz, który zastanawiam się, jaki jest właściwy sposób, powiedzmy, że mam funkcję, która otrzymuje parametr '$ event' jako parametr. Następnie używam '$ event.target.getAttribute ('some-attr')', aby uzyskać atrybut z elementu target. Czy jest to właściwy sposób, aby zrobić to, gdy nie ma dostępu do 'nativeElement' celu? Warto zauważyć, że sam związałem detektor zdarzeń za pomocą 'Renderer' w pierwszym miejscu, z którego pochodzi wydarzenie. – Chrillewoodz

2

Od getAttribute to jedynie metoda, można użyć invokeElementMethod:

var attr = renderer.invokeElementMethod(elementRef.nativeElement, 'getAttribute', []); 

Ta aplikacja Płoć nie zadziała, jeśli przełączysz się na renderowanie po stronie serwera (z wyjątkiem wywołań zdarzeń, takich jak kliknięcie myszą).

Rozszerzenie DOMRenderer skutecznie oznacza ścisłe połączenie z implementacją przeglądarki, która jest taka sama jak bezpośrednia manipulacja nativeElement.


Wydaje się, że nie powinno się powoływać pobierające w ogóle. Pytanie brzmi: dlaczego musisz znać wartość atrybutu lub nazwę klasy?

Można by stworzyć specyficzną dyrektywę lub zmienną szablon i używać go z ViewChild/ViewChildren lub stworzyć odpowiedni model danych i powiązać z [class.name]="nameEnabled"

+0

Hmm, jestem zaintrygowany. Wypróbuję to jutro i zobaczę, czy to się uda. Rozwiązałoby to problem, który omówiłem z Gunterem przy manipulowaniu obiektem zdarzenia. – Chrillewoodz

+0

Co jednak z 'classList' i innymi podobnymi właściwościami? – Chrillewoodz

+0

'classList' może być emulowane za pomocą atrybutu' class'. – kemsky

9

Aby usunąć atrybuty z DOM, podaj wartość null.

Aby ustawić atrybut (wartość atrybutu może być pusty ciąg, jeśli chcesz):

myrenderer.setElementAttribute(elementRef.nativeElement, 'attributename', 'attributevalue'); 

Aby usunąć atrybut:

myrenderer.setElementAttribute(elementRef.nativeElement, 'attributename', null); 

Aby uzyskać element wartość atrybutu, masz nativeElement, który przekazujesz do setElementAttribute, dzięki czemu możesz go użyć do uzyskania wartości atrybutu za pomocą standardowego kodu JavaScript:

elementRef.nativeElement.getAttribute('attributename'); 
Powiązane problemy