Jestem trochę zdezorientowany, jak uzyskać key
i value
obiektu w angular2 podczas korzystania *ngFor
z iteracji po obiekcie. Wiem, że w wersji kątowej 1.x istnieje taka składnia
ng-repeat="(key, value) in demo"
ale nie wiem jak to zrobić w angular2. Próbowałem czegoś podobnego, bez powodzenia:
<ul>
<li *ngFor='#key of demo'>{{key}}</li>
</ul>
demo = {
'key1': [{'key11':'value11'}, {'key12':'value12'}],
'key2': [{'key21':'value21'}, {'key22':'value22'}],
}
Oto plnkr z moją próbą: http://plnkr.co/edit/mIj619FncOpfdwrR0KeG?p=preview
Jak mogę uzyskać key1
i key2
dynamicznie korzystać *ngFor
? Po intensywnych poszukiwaniach wpadłem na pomysł użycia rur, ale nie wiem, jak sobie z tym poradzić. Czy jest jakaś wbudowana rura do robienia tego samego w angular2?
angular
typescript
object
Pardeep Jain
źródło
źródło
key, value
w angular2 nie ma żadnej pary składningFor
, powinieneś spojrzeć na tę odpowiedźPipe
do tego ..Odpowiedzi:
Uzyskaj
Object.keys
dostęp do szablonu i użyj go w*ngFor
.źródło
*ngFor
s. Pierwsze dwa przy użyciuobjectKeys
, najbardziej nie ma potrzeby (ponieważ to tylko tablica).Podobnie jak w najnowszej wersji Angular (v6.1.0) , Angular Team dodał nową wbudowaną potok dla tej samej nazwy co
keyvalue
potok, aby pomóc Ci iterować po obiektach, mapach i tablicach wcommon
module pakietu kątowego. Na przykład -Przykład rozwidlonego działania
sprawdź tutaj, aby uzyskać więcej przydatnych informacji -
Jeśli używasz Angulara w wersji 5 lub starszej lub chcesz osiągnąć za pomocą potoku, zastosuj się do tej odpowiedzi
źródło
*ngFor="let item of testObject | keyvalue:keepOriginalOrder"
a w swojej klasie zdefiniuj:public keepOriginalOrder = (a, b) => a.key
Możesz utworzyć niestandardowy potok, aby zwrócić listę kluczy dla każdego elementu. Coś w tym stylu:
i użyj go w ten sposób:
Edytować
Możesz także zwrócić wpis zawierający zarówno klucz, jak i wartość:
i użyj go w ten sposób:
źródło
keys.push({key: key, value: value[key]);
*ngFor
wyrażeń. Stwarza ogromne wąskie gardło wydajności, ponieważ musi generować kolekcję za każdym razem, gdy wykrywacz zmian sprawdza zmiany.pure:false
do rury, staje się ona bardzo nieefektywna. Czy masz rozwiązanie, aby ręcznie zaktualizować potok za każdym razem, gdy zmieniam obiekt (usuwam element)?common: NgFor has been removed as it was deprecated since v4. Use NgForOf instead. This does not impact the use of*ngFor in your templates.
( jaxenter.com/road-to-angular-5-133253.html )Aktualizacja
W wersji 6.1.0-beta.1 wprowadzono KeyValuePipe https://github.com/angular/angular/pull/24319
Przykład plunkera
Poprzednia wersja
Innym podejściem jest stworzenie
NgForIn
dyrektywy, która będzie stosowana w następujący sposób:Przykład plunkera
ngforin.directive.ts
źródło
Z Angular 6.1 możesz użyć potoku wartości klucza :
Ale ma tę niedogodność, że sortuje wynikową listę według wartości klucza. Jeśli potrzebujesz czegoś neutralnego:
Nie zapomnij podać atrybutu pure: false pipe. W takim przypadku potok jest wywoływany w każdym cyklu wykrywania zmian, nawet jeśli referencja wejściowa nie uległa zmianie (tak jest w przypadku dodawania właściwości do obiektu).
źródło
Opracowanie odpowiedzi @ Thierry z przykładem.
Nie ma wbudowanej rury ani metody pobierania
key and value
z pętli * ngFor. więc musimy stworzyć niestandardową potok dla tego samego. jak powiedział Thierry, tutaj jest odpowiedź z kodem.** Klasa pipe implementuje metodę transformacji interfejsu PipeTransform, która pobiera wartość wejściową i opcjonalną tablicę ciągów parametrów i zwraca wartość przekształconą.
** Metoda transformacji jest niezbędna dla rury. Interfejs PipeTransform definiuje tę metodę i prowadzi zarówno narzędzia, jak i kompilator. Jest opcjonalny; Angular szuka i wykonuje metodę transformacji niezależnie. więcej informacji na temat rury znajdziesz tutaj
a część HTML to:
Working Plnkr http://plnkr.co/edit/50LlK0k6OnMnkc2kNHM2?p=preview
aktualizacja do RC
jak sugeruje użytkownik6123723 (dzięki) w komentarzu tutaj jest aktualizacja.
źródło
@Marton miał istotny sprzeciw wobec zaakceptowanej odpowiedzi, uzasadniając to tym, że potok tworzy nową kolekcję przy każdym wykryciu zmiany. Zamiast tego utworzę HtmlService, który zapewnia szereg funkcji narzędziowych, z których widok może korzystać w następujący sposób:
źródło
Object.keys(...)
w * ngFor?TypeError: Cannot read property 'keys' of undefined
. Wygląda na to, że nie jest obsługiwany w szablonie.template
opcji, ale w rzeczywistym kodzie HTML szablonu? dziękiJeśli już korzystasz z Lodash, możesz zastosować to proste podejście, które obejmuje zarówno klucz, jak i wartość:
W pliku maszynopisu dołącz:
aw eksportowanym składniku uwzględnij:
źródło
Dzięki za fajkę, ale musiałem wprowadzić pewne zmiany, zanim mogłem użyć jej w kanciastym 2 RC5. Zmieniono linię importu potoku, a także dodano typ dowolnej do inicjalizacji tablicy kluczy.
źródło
Żadna z odpowiedzi tutaj nie działała dla mnie od razu po wyjęciu z pudełka, oto, co zadziałało dla mnie:
Twórz
pipes/keys.ts
z zawartością:Dodaj do
app.module.ts
(Twój główny moduł):a następnie dodaj do tablicy deklaracji modułu coś takiego:
Następnie w szablonie widoku możesz użyć czegoś takiego:
Oto dobre referencje, które znalazłem, jeśli chcesz przeczytać więcej.
źródło
#
itp. btw, twoja odpowiedź również jest poprawna bez wątpieniaJest naprawdę fajna biblioteka, która robi to wśród innych fajnych fajek. Nazywa się to ngx-pipe .
Na przykład klucz potok zwraca klucze do obiektu, a potok wartości zwraca wartość dla obiektu:
klucze do fajki
rura wartości
Nie musisz tworzyć własnej rury :)
źródło
Użyj indeksu:
Stosowanie:
źródło
Oto proste rozwiązanie
W tym celu można użyć iteratorów maszynopisu
źródło
zmień typ prezentacji na tablicę lub iteruj po obiekcie i prześlij do innej tablicy
i z HTML:
źródło
Myślę, że Object.keys jest najlepszym rozwiązaniem tego problemu. Dla każdego, kto spotka się z tą odpowiedzią i spróbuje dowiedzieć się, dlaczego Object.keys daje im [„0”, „1”] zamiast [„key1”, „key2”], przestroga - strzeż się różnicy między „ z „i” w „:
Już korzystałem z Object.keys, coś podobnego do tego:
Jednak zamiast
Nieumyślnie napisałem
który „działał” idealnie dobrze bez żadnego błędu i zwrócił
Kosztowało mnie to około 2 godzin googlingu i przekleństw.
(klepie się w czoło)
źródło
możesz uzyskać klucz obiektu dynamicznego, próbując tego
źródło
Na razie musisz to zrobić w ten sposób, wiem, że nie jest to zbyt wydajne, ponieważ nie chcesz konwertować obiektu otrzymanego z bazy ogniowej.
źródło