@Component({
(...)
template: `
<div *ngFor="let i of Arr(num).fill(1)"></div>
`
})
export class SomeComponent {
Arr = Array; //Array type captured in a variable
num:number = 20;
}
Lub zaimplementuj niestandardową rurę:
import {PipeTransform, Pipe} from '@angular/core';
@Pipe({
name: 'fill'
})
export class FillPipe implements PipeTransform {
transform(value) {
return (new Array(value)).fill(1);
}
}
@Component({
(...)
template: `
<div *ngFor="let i of num | fill"></div>
`,
pipes: [ FillPipe ]
})
export class SomeComponent {
arr:Array;
num:number = 20;
}
To powinna być prawidłowa odpowiedź. Jest zdecydowanie najbardziej zwięzła!
Mantisimo
ERROR RangeError: Nieprawidłowa długość tablicy. Spowoduje to awarię, gdy liczba kotów do narysowania wynosi zero.
Tom Bevelander
Naprawdę lubię to proste podejście!
F. Geißler
51
Istnieją dwa problemy z zalecanymi rozwiązaniami przy użyciu Arrays:
To marnotrawstwo. W szczególności w przypadku dużych ilości.
Trzeba je gdzieś zdefiniować, co skutkuje dużym bałaganem przy tak prostej i powszechnej operacji.
Wydaje się bardziej efektywne zdefiniowanie a Pipe(raz), zwracając Iterable:
import {PipeTransform, Pipe} from '@angular/core';
@Pipe({name: 'times'})
export class TimesPipe implements PipeTransform {
transform(value: number): any {
const iterable = <Iterable<any>> {};
iterable[Symbol.iterator] = function* () {
let n = 0;
while (n < value) {
yield ++n;
}
};
return iterable;
}
}
Przykład zastosowania (renderowanie siatki z dynamiczną szerokością / wysokością):
<table>
<thead>
<tr>
<th *ngFor="let x of colCount|times">{{ x }}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let y of rowCount|times">
<th scope="row">{{ y }}</th>
<td *ngFor="let x of colCount|times">
<input type="checkbox" checked>
</td>
</tr>
</tbody>
</table>
Najbardziej wydajnym i zwięzłym sposobem osiągnięcia tego jest dodanie narzędzia iteratora. Nie przejmuj się podawaniem wartości. Nie przejmuj się ustawieniem zmiennej w dyrektywie ngFor:
function times(max: number) {
return {
[Symbol.iterator]: function* () {
for (let i = 0; i < max; i++, yield) {
}
}
};
}
@Component({
template: ```
<ng-template ngFor [ngForOf]="times(6)">
repeats 6 times!
</ng-template>
```
})
export class MyComponent {
times = times;
}
Zadeklaruj zmienną składową w komponencie, aby odwoływać się do Lodash.
lodash = _;
Wtedy, twoim zdaniem, możesz użyć funkcji zakresu . 20 można zastąpić dowolną zmienną w komponencie.
*ngFor="let number of lodash.range(20)"
Trzeba powiedzieć, że powiązanie z funkcjami w widoku może być kosztowne, w zależności od złożoności funkcji, którą wywołujesz, ponieważ funkcja wykrywania zmian będzie wywoływać tę funkcję wielokrotnie.
Nie musisz wypełniać tablicy, jak sugerowano w większości odpowiedzi. Jeśli używasz indeksu w swojej ngForpętli, wszystko, co musisz utworzyć, to pusta tablica o odpowiedniej długości:
const elements = Array(n); // n = 20 in your case
i Twoim zdaniem:
<li *ngFor="let element in elements; let i = index">
<span>{{ i }}</span>
</li>
Zdefiniuj helperArray i utwórz jego wystąpienie dynamicznie (lub statycznie, jeśli chcesz) z długością liczby, którą chcesz utworzyć elementy HTML. Na przykład chcę pobrać dane z serwera i utworzyć elementy o długości zwracanej tablicy.
Odpowiedzi:
Możesz użyć następujących:
Lub zaimplementuj niestandardową rurę:
źródło
arr=Array;
?Zastąp
20
swoją zmiennąźródło
generuje 🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱
źródło
Istnieją dwa problemy z zalecanymi rozwiązaniami przy użyciu
Arrays
:Wydaje się bardziej efektywne zdefiniowanie a
Pipe
(raz), zwracającIterable
:Przykład zastosowania (renderowanie siatki z dynamiczną szerokością / wysokością):
źródło
Możesz to łatwo zrobić w swoim HTML:
I użyj zmiennej „numer” do indeksowania.
źródło
20
zmienną składową ... więc to niewiele pomoże*ngFor="let number of [0,1,2,3,4,5...,199,200]"
:-DProstsze i nadające się do wielokrotnego użytku rozwiązanie może używać niestandardowej dyrektywy strukturalnej, takiej jak ta.
I użyj tego w ten sposób:
źródło
Najbardziej wydajnym i zwięzłym sposobem osiągnięcia tego jest dodanie narzędzia iteratora. Nie przejmuj się podawaniem wartości. Nie przejmuj się ustawieniem zmiennej w dyrektywie ngFor:
źródło
Jeśli korzystasz z Lodash , możesz wykonać następujące czynności:
Importuj Lodash do swojego komponentu.
Zadeklaruj zmienną składową w komponencie, aby odwoływać się do Lodash.
Wtedy, twoim zdaniem, możesz użyć funkcji zakresu . 20 można zastąpić dowolną zmienną w komponencie.
Trzeba powiedzieć, że powiązanie z funkcjami w widoku może być kosztowne, w zależności od złożoności funkcji, którą wywołujesz, ponieważ funkcja wykrywania zmian będzie wywoływać tę funkcję wielokrotnie.
źródło
Nie musisz wypełniać tablicy, jak sugerowano w większości odpowiedzi. Jeśli używasz indeksu w swojej
ngFor
pętli, wszystko, co musisz utworzyć, to pusta tablica o odpowiedniej długości:i Twoim zdaniem:
źródło
Prostsze podejście:
Zdefiniuj helperArray i utwórz jego wystąpienie dynamicznie (lub statycznie, jeśli chcesz) z długością liczby, którą chcesz utworzyć elementy HTML. Na przykład chcę pobrać dane z serwera i utworzyć elementy o długości zwracanej tablicy.
Następnie użyj helperArray w moim szablonie HTML.
źródło
Oto nieco ulepszona wersja dyrektywy strukturalnej Ilyass Lamrani, która pozwala na użycie indeksu w szablonie:
Stosowanie:
źródło
Wiem, że poprosiłeś o zrobienie tego za pomocą * ngFor, ale chciałem podzielić się sposobem, w jaki rozwiązałem to za pomocą dyrektywy strukturalnej:
Dzięki temu możesz go używać tak po prostu:
źródło
Możesz użyć tego po prostu:
HTML
TS
źródło