@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;
}
Или реализовать собственный канал:
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;
}
Шикарное решение довольно неудобной задачи. Но я полагаю, это влияет на производительность для большого количества элементов?
Мартин Эклебен,
51
При использовании рекомендуемых решений возникают две проблемы Arrays:
Это расточительно. В особенности для большого количества.
Вы должны где-то определить их, что создает много помех для такой простой и распространенной операции.
Кажется более эффективным определить Pipe(один раз), возвращая 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;
}
}
Пример использования (рендеринг сетки с динамической шириной / высотой):
<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>
OP сказал, что он назначил 20переменную-член .. так что это не сильно поможет
phil294
Что, если я хочу повторить 200 раз?
Chax
1
@Chax Ты не можешь. :(
Мухаммад бин Юсрат
2
@Chax Что не так с 200? *ngFor="let number of [0,1,2,3,4,5...,199,200]":-D
Stack
1
@StackUnderflow К сожалению, мне не платят персонажи. Если бы я был таким, я бы проповедовал, что это единственный способ добиться этого: P (серьезно, просто не надо;))
Chax
10
Более простое и многоразовое решение, возможно, будет использовать такую настраиваемую структурную директиву.
import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[appTimes]'
})
export class AppTimesDirective {
constructor(
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef) { }
@Input() set appTimes(times: number) {
for (let i = 0 ; i < times ; i++) {
this.viewContainer.createEmbeddedView(this.templateRef);
}
}
}
Самый эффективный и краткий способ добиться этого - добавить утилиту итератора. Не беспокойтесь о ценностях. Не беспокойтесь о настройке переменной в директиве 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;
}
Объявите переменную-член в компоненте для ссылки на Lodash.
lodash = _;
Затем, по вашему мнению, вы можете использовать функцию диапазона . 20 можно заменить любой переменной в вашем компоненте.
*ngFor="let number of lodash.range(20)"
Следует отметить, что привязка к функциям в представлении может быть дорогостоящей, в зависимости от сложности вызываемой функции, поскольку обнаружение изменений будет вызывать функцию повторно.
Вам не нужно заполнять массив, как это предлагается в большинстве ответов. Если вы используете индекс в своем ngForцикле, все, что вам нужно создать, - это пустой массив правильной длины:
const elements = Array(n); // n = 20 in your case
и на ваш взгляд:
<li *ngFor="let element in elements; let i = index">
<span>{{ i }}</span>
</li>
Определите helperArray и создайте его динамически (или статически, если хотите) с длиной счетчика, который вы хотите создать для своих HTML-элементов. Например, я хочу получить данные с сервера и создать элементы с длиной возвращаемого массива.
Ответы:
Вы можете использовать следующее:
Или реализовать собственный канал:
источник
arr=Array;
?генерирует 🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱
источник
Замените
20
своей переменнойисточник
При использовании рекомендуемых решений возникают две проблемы
Arrays
:Кажется более эффективным определить
Pipe
(один раз), возвращаяIterable
:Пример использования (рендеринг сетки с динамической шириной / высотой):
источник
Вы можете просто сделать это в своем HTML:
И используйте переменную «число» для индексации.
источник
20
переменную-член .. так что это не сильно поможет*ngFor="let number of [0,1,2,3,4,5...,199,200]"
:-DБолее простое и многоразовое решение, возможно, будет использовать такую настраиваемую структурную директиву.
И используйте это так:
источник
Самый эффективный и краткий способ добиться этого - добавить утилиту итератора. Не беспокойтесь о ценностях. Не беспокойтесь о настройке переменной в директиве ngFor:
источник
Если вы используете Lodash , вы можете сделать следующее:
Импортируйте Lodash в свой компонент.
Объявите переменную-член в компоненте для ссылки на Lodash.
Затем, по вашему мнению, вы можете использовать функцию диапазона . 20 можно заменить любой переменной в вашем компоненте.
Следует отметить, что привязка к функциям в представлении может быть дорогостоящей, в зависимости от сложности вызываемой функции, поскольку обнаружение изменений будет вызывать функцию повторно.
источник
Вам не нужно заполнять массив, как это предлагается в большинстве ответов. Если вы используете индекс в своем
ngFor
цикле, все, что вам нужно создать, - это пустой массив правильной длины:и на ваш взгляд:
источник
Более простой подход:
Определите helperArray и создайте его динамически (или статически, если хотите) с длиной счетчика, который вы хотите создать для своих HTML-элементов. Например, я хочу получить данные с сервера и создать элементы с длиной возвращаемого массива.
Затем используйте helperArray в моем HTML-шаблоне.
источник
Вот немного улучшенная версия структурной директивы Ильяса Ламрани, которая позволяет вам использовать индекс в вашем шаблоне:
Использование:
источник
Я знаю, что вы специально просили сделать это с помощью * ngFor, но я хотел поделиться тем, как я решил это, используя структурную директиву:
При этом вы можете использовать его так:
источник
Вы можете использовать это просто:
HTML
TS
источник