Używam ng-repeat z moim kodem Mam 'n' liczbę pól tekstowych na podstawie ng-repeat. Chcę wyrównać pole tekstowe z trzema kolumnami.
to jest mój kod
<div class="control-group" ng-repeat="oneExt in configAddr.ext">
{{$index+1}}.
<input type="text" name="macAdr{{$index+1}}"
id="macAddress" ng-model="oneExt.newValue" value=""/>
</div>
Odpowiedzi:
Najbardziej niezawodnym i technicznie poprawnym podejściem jest transformacja danych w kontrolerze. Oto prosta funkcja i użycie fragmentu.
Wtedy Twój widok wyglądałby tak:
Jeśli masz jakiekolwiek dane wejściowe w ramach
ng-repeat
, prawdopodobnie będziesz chciał odblokować / ponownie dołączyć tablice, gdy dane są modyfikowane lub przesyłane. Oto jak wyglądałoby to w formacie a$watch
, aby dane były zawsze dostępne w oryginalnym, scalonym formacie:Wiele osób woli to osiągnąć w widoku z filtrem. Jest to możliwe, ale powinno być używane tylko do celów wyświetlania! Jeśli dodasz dane wejściowe w tym przefiltrowanym widoku, spowoduje to problemy, które można rozwiązać, ale nie są ładne ani niezawodne .
Problem z tym filtrem polega na tym, że za każdym razem zwraca nowe zagnieżdżone tablice. Angular obserwuje wartość zwracaną przez filtr. Przy pierwszym uruchomieniu filtru Angular zna wartość, a następnie uruchamia go ponownie, aby upewnić się, że została zmieniona. Jeśli obie wartości są takie same, cykl jest zakończony. Jeśli nie, filtr będzie uruchamiał się raz po raz, aż będą takie same, lub Angular zorientuje się, że występuje nieskończona pętla trawienia i wyłączy się. Ponieważ nowe zagnieżdżone tablice / obiekty nie były wcześniej śledzone przez Angular, zawsze widzi wartość zwracaną jako inną niż poprzednia. Aby naprawić te „niestabilne” filtry, musisz umieścić filtr w
memoize
funkcji.lodash
mamemoize
funkcję, a najnowsza wersja lodash zawiera równieżchunk
funkcję, więc możemy utworzyć ten filtr w bardzo prosty sposób za pomocąnpm
modułów i kompilowanie skryptu za pomocąbrowserify
lubwebpack
.Pamiętaj: tylko wyświetlaj! Filtruj w kontrolerze, jeśli używasz wejść!
Zainstaluj lodash:
Utwórz filtr:
A oto próbka z tym filtrem:
Zamawiaj pozycje pionowo
Jeśli chodzi o kolumny pionowe (lista od góry do dołu), a nie poziome (od lewej do prawej), dokładna implementacja zależy od pożądanej semantyki. Listy, które dzielą się nierównomiernie, można podzielić na różne sposoby. Oto jeden sposób:
Jednak najbardziej bezpośrednim i po prostu prostym sposobem uzyskania kolumn jest użycie kolumn CSS :
źródło
a b c
drugim wierszud e f
. Czy mogę wyświetlaća b
w pierwszej kolumniec d
w drugiej kolumnie ie f
w trzeciej kolumnie? Dzięki[].concat.call([], val)
. Musisz się zastanowić, co sięapply
dzieje.val
jest tablicą tablic i chcemy przekazać każdą z tych tablic wewnątrz niej jako argumentyconcat
. Myślę, że skupiasz się na kontekście[]
, o co tutaj nie chodzi. Chcemy[].concat(val[1], val[2], val[3], etc)
, więc potrzebujemyapply([], val)
[]
vs[[]]
i[{}]
. Zagnieżdżona tablica / obiekt sprawia, że Angular widzi inny wynik na każdymfilter
i powtarza się, aby wynik pozostał taki sam (stabilizacja).var x = [1,2,3]; var y = [1,2,3]; console.log(x === y);
Dogłębne sprawdzanie oznacza określanie i porównywanie ciągów, co jest ryzykowne, ponieważ obiekt może nie być poddawany stringifikacji, lub rekursywne sprawdzanie każdej właściwości indywidualnie. Myślę, że Angular mógłby to zaimplementować w przypadku filtrów, ale jestem pewien, że jest dobry powód, dla którego tego nie zrobili. Prawdopodobnie dlatego, że chodziło im głównie o filtry do prostej modyfikacji zbioru danych, a nie do całkowitego remontu ze zmianami w strukturze.To rozwiązanie jest bardzo proste:
JSON:
HTML:
DEMO w FIDDLE
źródło
ng-switch-when="0"
jeden element na zewnętrznym div zamiast wszystkich trzech elementów.Czyste, elastyczne rozwiązanie, które nie wymaga manipulacji danymi :
HTML:
CSS:
JavaScript:
Jest to proste rozwiązanie do dynamicznego renderowania danych w wierszach i kolumnach bez konieczności manipulowania tablicą danych, którą próbujesz wyświetlić. Dodatkowo, jeśli spróbujesz zmienić rozmiar okna przeglądarki, zobaczysz, że siatka dynamicznie dostosowuje się do rozmiaru ekranu / div.
(Dodałem również sufiks {{$ index}} do twojego identyfikatora, ponieważ ng-repeat spróbuje utworzyć wiele elementów z tym samym identyfikatorem, jeśli tego nie zrobisz.)
Podobny przykład roboczy
źródło
<span ng-repeat="z in waiverModalLinks" ng-class="{'new-row':startNewRow($index, columnBreak)}" class="{{z.id}}"><a href="{{z.link}}{{z.title}}">{{z.title}}</a></span>
To jest wewnątrz „ciała modalnego”.odpowiedź m59 jest całkiem dobra. Jedną rzeczą, która mi się nie podoba, jest to, że używa
div
s do tego, co może być danymi dla tabeli.Więc w połączeniu z filtrem m59 (odpowiedź gdzieś powyżej), oto jak wyświetlić go w tabeli.
źródło
Oto prostszy sposób:
Odpowiedź Cumulo Nimbus jest dla mnie przydatna, ale chcę, aby ta siatka była zawinięta w element div, który może wyświetlać pasek przewijania, gdy lista jest zbyt długa.
Aby to osiągnąć, dodałem
style="height:200px; overflow:auto"
element div dookoła tabeli, co powoduje, że jest on wyświetlany jako pojedyncza kolumna.Teraz działa dla tablicy o długości jeden.
źródło
ng-hide="$index%2!==0"
Mam funkcję i zapisałem ją w usłudze, dzięki czemu mogę jej używać w całej mojej aplikacji:
Usługa:
});
Kontroler:
Narzut:
źródło
Moje podejście było mieszanką rzeczy.
Moim celem było dostosowanie siatki do rozmiaru ekranu. Chciałem 3 kolumny dla
lg
, 2 kolumny dlasm
imd
i 1 kolumnę dlaxs
.Najpierw utworzyłem następującą funkcję zakresu, używając
$window
usługi kątowej :Następnie skorzystałem z klasy zaproponowanej przez @Cumulo Nimbus:
W elemencie div zawierającym element
ng-repeat
dodałemresizable
dyrektywę, jak wyjaśniono na tej stronie , dzięki czemu za każdym razem, gdy rozmiar okna jest zmieniany,$window
usługa kątowa jest aktualizowana o nowe wartości.Ostatecznie w powtarzanym div mam:
Proszę, daj mi znać o wszelkich wadach tego podejścia.
Mam nadzieję, że to może być pomocne.
źródło
Prosta sztuczka z "clearfix" CSS polecana przez Bootstrap:
Wiele zalet: wydajnie, szybko, korzystając z zaleceń Boostrap, unikając możliwych problemów z trawieniem i nie zmieniając modelu Angular.
źródło
Ten przykład tworzy zagnieżdżony repeater, w którym dane zewnętrzne zawierają wewnętrzną tablicę, którą chciałem wyświetlić w dwóch kolumnach. Koncepcja byłaby prawdziwa dla trzech lub więcej kolumn.
W wewnętrznej kolumnie powtarzam „wiersz” aż do osiągnięcia limitu. Limit jest określany przez podzielenie długości tablicy elementów przez liczbę żądanych kolumn, w tym przypadku przez dwa. Metoda dzielenia znajduje się na kontrolerze i jako parametr jest przekazywana bieżąca długość tablicy. Następnie funkcja wycinka JavaScript (0, array.length / columnCount) zastosowała ograniczenie do repeatera.
Następnie wywoływany jest wtórnik drugiej kolumny i powtarza wycinek (array.length / columnCount, array.length), który tworzy drugą połowę tablicy w drugiej kolumnie.
Mam nadzieję, że pomoże to spojrzeć na rozwiązanie w jeszcze inny sposób. (PS to mój pierwszy post tutaj! :-))
źródło
Naprawiam bez .row
i css
źródło
Oto łatwy sposób na zrobienie tego. Jest bardziej ręczny i kończy się niechlujnymi znacznikami. Nie polecam tego, ale są sytuacje, w których może to być przydatne.
Oto link do skrzypiec http://jsfiddle.net/m0nk3y/9wcbpydq/
HTML:
JS:
Ta konfiguracja wymaga od nas użycia matematyki w znaczniku: /, więc musisz wstrzyknąć Math, dodając tę linię:
$scope.Math = Math;
źródło
Wszystkie te odpowiedzi wydają się przesadnie skomplikowane.
Zdecydowanie najprostszą metodą byłoby skonfigurowanie wejściowych elementów div w układzie ładowania początkowego col-md-4, a następnie bootstrap automatycznie sformatuje go w 3 kolumnach ze względu na 12-kolumnowy charakter programu ładującego:
źródło
źródło
Opierając się na bardzo dobrej odpowiedzi m59. Odkryłem, że dane wejściowe modelu byłyby rozmyte, gdyby się zmieniły, więc można zmieniać tylko jeden znak na raz. To jest nowa lista obiektów dla każdego, kto tego potrzebuje:
A to byłoby użycie:
źródło
Jestem nowy w bootstrap i angularjs, ale może to również sprawić, że Array per 4 items jako jedna grupa, a wynik będzie prawie jak 3 kolumny. Ta sztuczka wykorzystuje zasadę linii przerwania bootstrap.
źródło
Lodash ma teraz wbudowaną metodę chunk, której osobiście używam: https://lodash.com/docs#chunk
Na tej podstawie kod kontrolera może wyglądać następująco:
Wyświetl kod:
źródło
Innym sposobem jest ustawienie
width:33.33%; float:left
opakowującego elementu div w następujący sposób:źródło
Znalazłem się w podobnym przypadku, chcąc wygenerować grupy wyświetlania po 3 kolumny każda. Jednak, mimo że używałem bootstrapu, próbowałem podzielić te grupy na różne nadrzędne elementy DIV. Chciałem też zrobić coś ogólnie użytecznego.
Podszedłem do tego z 2
ng-repeat
jak poniżej:Dzięki temu bardzo łatwo jest zmienić liczbę kolumn i podzielić je na kilka nadrzędnych elementów div.
źródło
Na wszelki wypadek, gdyby ktoś chciał mieć Angular 7 (i wyższą wersję), oto przykład, którego użyłem w jednej z moich aplikacji:
HTML:
PLIK TS
Jest to świetne rozwiązanie do dynamicznego tworzenia nowych kolumn / wierszy w zależności od tego, ile elementów iterujesz z bazy danych. Dzięki!
źródło
To odpowiada na pierwotne pytanie, jak uzyskać 1,2,3 w kolumnie. - zapytał kuppu 8 lutego 2014 o 13:47
kod angularjs:
Wyświetl kod (uwaga: używając bootstrap 3):
źródło
Ten kod pomoże wyrównać elementy z trzema kolumnami w trybie lg i md, dwiema kolumnami w trybie sm, a pojedyncza kolumna w trybie xs
źródło