• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

AngularJS - ng-repeat dla child elementów

Object Storage Arubacloud
+1 głos
145 wizyt
pytanie zadane 3 kwietnia 2022 w JavaScript przez Bartek030 Obywatel (1,460 p.)

Witam,

Rozpocząłem naukę biblioteki AngularJS, w ramach której próbuję przerobić "Wisielca" z jednego z odcinków JS M. Zelenta w taki sposób, aby działał w oparciu o ten framework. Obecnie próbuję wyświetlić wszystkie litery na ekran i mam problem z dodaniem div'a ze stylem "clear: both;" Poniżej przedstawię obecny stan:

W service na chwilę obecną mam tablicę oraz metodę:

var LETTERS = ["A", "Ą", "B", "C", "Ć", "D", "E", "Ę", "F", "G", "H", "I", "J", "K", "L", "Ł", "M", "N", "Ń", "O", "Ó", "P", "Q", "R", "S", "Ś", "T", "U", "V", "W", "X", "Y", "Z", "Ż", "Ź"];

service.getLetters = function() {
    return LETTERS;
};

Do kontrolera pobieram litery w następujący sposób:

hangman.letters = HangmanGameService.getLetters();

I teraz w templatce html chcę wyświetlić te litery w taki sposób jak to jest w odcinku JS:

<div id="alphabet">
    <div class="letter" ng-repeat="let in hangman.letters" ng-click="hangman.check($index)" id="let{{$index}}">
        {{ let }}
    </div>
    <div class="hangman-clear" ng-if="$index + 1 % 7 == 0"></div>
</div>

W odcinku po każdych 7 literach dodawany jest div ze stylem "clear: both;", Tutaj jest dodany tylko na końcu (po 35 literach).

Chciałem zapytać czy jest możliwość zmodyfikowania ng-repeat w taki sposób aby pętla dotyczyła child elementów? Inaczej mówiąc chciałem ng-repeat umieścić w div'ie "alphabet", który sam w sobie nie byłby powtarzany a jedynie jego child elementy. Wtedy kod powyżej miałby sens. Na chwilę obecną mam 1 inny pomysł, którego wolałbym nie używać, bo dotyczy podzielenia tablicy z literami na kilka mniejszych.

2 odpowiedzi

0 głosów
odpowiedź 3 kwietnia 2022 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 3 kwietnia 2022 przez Bartek030
 
Najlepsza

W odcinku po każdych 7 literach dodawany jest div ze stylem "clear: both;", Tutaj jest dodany tylko na końcu (po 35 literach). 

Czyli chcesz w środku pętli, co każde 7 znaków, wstawiać element ze swoim stylem? Czemu więc nie wstawisz elementu o klasie hangman-clear (na którym jest dyrektywa ng-if) do środka elementu z pętlą?

Chciałem zapytać czy jest możliwość zmodyfikowania ng-repeat w taki sposób aby pętla dotyczyła child elementów? Inaczej mówiąc chciałem ng-repeat umieścić w div'ie "alphabet", który sam w sobie nie byłby powtarzany a jedynie jego child elementy.

A teraz to tak nie działa? Dyrektywa ng-repeat jest umieszczona w jednym z dzieci #alphabet, czyli #alpahbet nie jest powtarzany, a jedynie element z ng-repeat.


Na marginesie:

1
komentarz 3 kwietnia 2022 przez Wiciorny Ekspert (270,190 p.)
Chyba, że chce pracować w google :D to tam angular JS i angular2 jest używany
komentarz 3 kwietnia 2022 przez Bartek030 Obywatel (1,460 p.)

@ScriptyChris,

Czyli chcesz w środku pętli, co każde 7 znaków, wstawiać element ze swoim stylem? Czemu więc nie wstawisz elementu o klasie hangman-clear (na którym jest dyrektywa ng-if) do środka elementu z pętlą?

Z prostego powodu - będzie on wtedy child'em tego div'a a jak rzucisz okiem na kod z odcinka to zarówno  div'y z literami jak i ten pusty z "clear: both;" są bezpośrednimi child'ami div'a alfabet.

A teraz to tak nie działa? Dyrektywa ng-repeat jest umieszczona w jednym z dzieci #alphabet, czyli #alpahbet nie jest powtarzany, a jedynie element z ng-repeat.

Niestety nie. ng-repeat powtarza tego div'a, w którym jest deklarowany - łącznie z jego child'ami.

Co do marginesu - nie mam odgórnego przymusu, ale ze względu na moją obecną sytuację prędzej czy później będę miał z nim kontakt. Dlatego chcę poznać przynajmniej podstawy. Stąd też sam projekt nie jest zbyt ambitny, bo jakby nie patrzeć to tylko przerobione strony, stworzone w tutorial'u. Generalnie uczę się Javy + Spring'a a jednocześnie miałem plan na naukę właśnie Angulara 2+, na potrzeby tworzenia frontów w aplikacjach.

Jestem też świadom, że ten przykład można zrobić co najmniej na 5 lepszych sposobów, ale nie to jest celem tego projektu. Chciałem po prostu poćwiczyć AngularJS i w możliwie największym stopniu odtworzyć te stronki.

komentarz 3 kwietnia 2022 przez ScriptyChris Mędrzec (190,190 p.)

Czyli tego próbowałeś?

<div id="alphabet">
    <div class="letter" ng-repeat="let in hangman.letters" ng-click="hangman.check($index)" id="let{{$index}}">
        {{ let }}

        <div class="hangman-clear" ng-if="$index + 1 % 7 == 0"></div>
    </div>
</div>

Dyrektywa ng-if powinna renderować element tylko jeśli będzie spełniony warunek. Więc, na oko, to powinno działać tak jak w odcinku: https://youtu.be/9FVtiJHFCSU?t=2612

komentarz 3 kwietnia 2022 przez Bartek030 Obywatel (1,460 p.)
Tak, dokładnie tego próbowałem i tak ng-if dodaje tego div'a tylko jeśli jest spełniony warunek. Natomiast w tym przypadku ten div z if'em staje się dzieckiem div'a .letter, a w odcinku wszystkie div'y są bezpośrednimi child'ami div'a alfabet.
komentarz 3 kwietnia 2022 przez ScriptyChris Mędrzec (190,190 p.)

A, już wiem co chcesz osiągnąć: element .hangman-clear ma być warunkowo powtarzalnym rodzeństwem dla każdorazowo powtórzonych elementów o klasie letter. Spróbuj użyć kombinacji ng-repeat-start razem z ng-repeat-end:

<div id="alphabet">
    <div class="letter" 
        ng-repeat-start="let in hangman.letters" 
        ng-click="hangman.check($index)" 
        id="let{{$index}}"
    >
        {{ let }}
    </div>
    <div class="hangman-clear" 
        ng-repeat-end 
        ng-if="$index + 1 % 7 == 0"
    ></div>
</div>
2
komentarz 3 kwietnia 2022 przez Bartek030 Obywatel (1,460 p.)

Super, działa dokładnie tak jak tego chciałem. Musiałem tylko poprawić warunek:

ng-if="($index + 1) % 7 == 0"

Bez tych nawiasów zawsze był niespełniony smiley Dzięki za pomoc!

0 głosów
odpowiedź 3 kwietnia 2022 przez Wiciorny Ekspert (270,190 p.)

To jest twój iterator po elementach, w nim w śodku niego nie ma diva. To jest jedyynie opakowanie dla wyświetlanych wartości . Każdy element niejako będzie divem, zależy czy chcesz dodać kolejny div... czy po każdym.
To co jest tutaj 

<div class="hangman-clear" ng-if="$index + 1 % 7 == 0"></div>

znajduje się poza iteratorem zewnętrznym, należy to do diva- alfabet 

 <div class="letter" ng-repeat="let in hangman.letters" ng-click="hangman.check($index)" id="let{{$index}}">

ten div i ng-repeat ... nie obejmuje tego co dzieje się w divie o class="hangman-clear" gdyż div, repeat zamykany jest po wypisaniu wartości 

Użyj PIPE z indexowaniem, i potem zaleznie od indeksu wyświeltaj w ng-if, wewnątrz żę jeśli spełni warunek to wyświetli diva 
 

      <li *ngFor="let item of items; index as i; trackBy: trackByFn">...</li>

 

komentarz 3 kwietnia 2022 przez Bartek030 Obywatel (1,460 p.)
edycja 3 kwietnia 2022 przez Bartek030

Tak, przykład powyżej jest błędny - dlatego też założyłem ten temat smiley

Dzięki za sugestię, spróbuję użyć PIPE.

EDIT:

Jedno pytanie - na pewno mówimy tutaj o AngularJS (nie Angular 2+)? W dokumentacji nie mogę znaleźć informacji na ten temat a na innych forach jest wprost napisane, że ngFor nie istnieje w wersji JS. No i zdecydowanie chcę tutaj uniknąć tworzenia custom'owych dyrektyw lub komponentów.

Podobne pytania

0 głosów
3 odpowiedzi 260 wizyt
pytanie zadane 16 stycznia 2017 w JavaScript przez Captivity Obywatel (1,030 p.)
0 głosów
1 odpowiedź 107 wizyt
0 głosów
1 odpowiedź 200 wizyt
pytanie zadane 24 sierpnia 2016 w JavaScript przez tajemniczyPan Nowicjusz (140 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...