Angular 2 - 집합 대신 숫자를 사용하기 위한 NgF
예를 들어...
<div class="month" *ngFor="#item of myCollection; #i = index">
...
</div>
이런 일을 할 수 있을까요?
<div class="month" *ngFor="#item of 10; #i = index">
...
</div>
...다음과 같은 비우호적인 솔루션에 매력을 느끼지 못합니다.
<div class="month" *ngFor="#item of ['dummy','dummy','dummy','dummy','dummy',
'dummy','dummy','dummy']; #i = index">
...
</div>
?
구성 요소 내에서 아래 설명된 대로 숫자 배열(ES6)을 정의할 수 있습니다.
export class SampleComponent {
constructor() {
this.numbers = Array(5).fill().map((x,i)=>i); // [0,1,2,3,4]
this.numbers = Array(5).fill(4); // [4,4,4,4,4]
}
}
어레이 생성에 대한 자세한 내용은 다음 링크를 참조하십시오.1에서 정수 배열을 만드는 테스터 방법.자바스크립트로 20.
은 이 에 그다이사반수있습다니복할여용하런를로 반복할 수 있습니다.ngFor
:
@Component({
template: `
<ul>
<li *ngFor="let number of numbers">{{number}}</li>
</ul>
`
})
export class SampleComponent {
(...)
}
또는 짧게:
@Component({
template: `
<ul>
<li *ngFor="let number of [0,1,2,3,4]">{{number}}</li>
</ul>
`
})
export class SampleComponent {
(...)
}
@OP, 당신은 "우아하지 않은" 해결책에 매우 근접했습니다.
어때요?
<div class="month" *ngFor="let item of [].constructor(10); let i = index">
...
</div>
여기서 저는 그것을 받고 있습니다.Array
: 빈 배 의생성자:[].constructor
, 냐면왜Array
템플릿 구문에서 인식되는 기호가 아닙니다. 그리고 저는 너무 게을러서 할 수 없습니다.Array=Array
또는counter = Array
4번째 예에서 @preteep-jain이 했던 것과 같은 구성 요소 유형 스크립트에서.그리고 나는 그것을 없이 부를 것입니다.new
new
하지 않습니다.Array
시공자
Array(30)
그리고.new Array(30)
동등합니다.
어레이는 비어 있지만, 사용자가 정말로 사용하기를 원하기 때문에 중요하지 않습니다.i
;let i = index
당신의 고리 안에.
주석에 응답하려면 편집:
Q. 변수를 사용하여 NgFor 루프의 길이를 설정하려면 어떻게 해야 합니까?
다음은 변수 열/행이 있는 테이블을 렌더링하는 방법에 대한 예제입니다.
<table class="symbolTable">
<tr *ngFor="let f of [].constructor(numRows); let r = index">
<td class="gridCell" *ngFor="let col of [].constructor(numCols); let c = index">
{{gridCards[r][c].name}}
</td>
</tr>
</table>
export class AppComponent implements OnInit {
title = 'simbologia';
numSymbols = 4;
numCols = 5;
numRows = 5;
guessCards: SymbolCard[] = [];
gridCards: SymbolCard[][] = [];
ngOnInit(): void {
for (let c = 0; c < this.numCols; c++) {
this.guessCards.push(new SymbolCard());
}
for (let r = 0; r < this.numRows; r++) {
let row: SymbolCard[] = [];
for (let c = 0; c < this.numCols; c++) {
row.push(
new SymbolCard({
name: '' + r + '_' + c
}))
}
this.gridCards.push(row);
}
}
}
NgFor 대신 숫자 컬렉션을 사용하는 방법은 아직 없습니다. 현재 *ngFor는 컬렉션을 매개 변수로만 허용하지만 다음 방법을 사용하여 이를 수행할 수 있습니다.
파이프 사용
demo-number.pipe.ts:
import {Pipe, PipeTransform} from 'angular2/core';
@Pipe({name: 'demoNumber'})
export class DemoNumber implements PipeTransform {
transform(value, args:string[]) : any {
let res = [];
for (let i = 0; i < value; i++) {
res.push(i);
}
return res;
}
}
최신 버전의 경우 가져오기를 변경하고 제거해야 합니다.args[]
매개변수:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({name: 'demoNumber'})
export class DemoNumber implements PipeTransform {
transform(value) : any {
let res = [];
for (let i = 0; i < value; i++) {
res.push(i);
}
return res;
}
}
html:
<ul>
<li>Method First Using PIPE</li>
<li *ngFor='let key of 5 | demoNumber'>
{{key}}
</li>
</ul>
HTML(View)에서 숫자 배열을 직접 사용
<ul>
<li>Method Second</li>
<li *ngFor='let key of [1,2]'>
{{key}}
</li>
</ul>
분할 방법 사용
<ul>
<li>Method Third</li>
<li *ngFor='let loop2 of "0123".split("")'>{{loop2}}</li>
</ul>
구성 요소에서 새 배열 만들기 사용
<ul>
<li>Method Fourth</li>
<li *ngFor='let loop3 of counter(5) ;let i= index'>{{i}}</li>
</ul>
export class AppComponent {
demoNumber = 5 ;
counter = Array;
numberReturn(length){
return new Array(length);
}
}
#작업 데모
저는 구성 요소를 단순 반복하기 위해 배열을 할당하는 것을 참을 수 없어서 구조 지침을 작성했습니다.단순한 형태로는 인덱스를 템플릿에서 사용할 수 없습니다. 다음과 같습니다.
import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';
@Directive({ selector: '[biRepeat]' })
export class RepeatDirective {
constructor( private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef) { }
@Input('biRepeat') set count(c:number) {
this.viewContainer.clear();
for(var i=0;i<c;i++) {
this.viewContainer.createEmbeddedView(this.templateRef);
}
}
}
http://plnkr.co/edit/bzoNuL7w5Ub0H5MdYyFR?p=preview
당신은 또한 그렇게 사용할 수 있습니다.
export class SampleComponent {
numbers:Array<any> = [];
constructor() {
this.numbers = Array.from({length:10},(v,k)=>k+1);
}
}
HTML
<p *ngFor="let i of numbers">
{{i}}
</p>
이는 다음과 같이 달성할 수도 있습니다.
HTML:
<div *ngFor="let item of fakeArray(10)">
...
</div>
유형 스크립트:
fakeArray(length: number): Array<any> {
if (length >= 0) {
return new Array(length);
}
}
파이프를 사용하여 숫자를 배열로 변환합니다.
@Pipe({
name: 'enumerate',
})
export class EnumeratePipe implements PipeTransform {
transform(n: number): number[] {
return [...Array(n)].map((_,i) => i);
}
}
그런 다음 템플릿의 파이프를 사용합니다.
<p *ngFor="let i of 5 | enumerate">
Index: {{ i }}
</p>
https://stackblitz.com/edit/angular-ivy-pkwvyw?file=src/app/app.component.html
Angular 5.2.6과 TypeScript 2.6.2를 사용하여 다음과 같이 해결했습니다.
class Range implements Iterable<number> {
constructor(
public readonly low: number,
public readonly high: number,
public readonly step: number = 1
) {
}
*[Symbol.iterator]() {
for (let x = this.low; x <= this.high; x += this.step) {
yield x;
}
}
}
function range(low: number, high: number) {
return new Range(low, high);
}
다음과 같은 구성요소에서 사용할 수 있습니다.
@Component({
template: `<div *ngFor="let i of r">{{ i }}</div>`
})
class RangeTestComponent {
public r = range(10, 20);
}
오류 확인 및 간결함을 위해 의도적으로 생략된 주장(예: 단계가 음수인 경우 발생하는 작업).
로다쉬를 사용할 수 있습니다.
@Component({
selector: 'board',
template: `
<div *ngFor="let i of range">
{{i}}
</div>
`,
styleUrls: ['./board.component.css']
})
export class AppComponent implements OnInit {
range = _.range(8);
}
나는 코드 테스트를 하지 않았지만 작동할 것입니다.
<div *ngFor="let number of [].constructor(myCollection)">
<div>
Hello World
</div>
</div>
이것은 내 컬렉션에 있는 횟수만큼 반복할 수 있는 쉽고 빠른 방법입니다.
그래서 만약 내 컬렉션이 5라면 헬로 월드는 5번 반복될 것입니다.
내 구성요소.ts
numbers: number[] = [];
constructor() {
this.numbers = new Array<number>(10)
}
My-component.html
<div *ngFor="let num of numbers; let i = index">{{ i }}</div>
인수가 없는 fill() 방법(승인된 답변에 언급됨)이 오류를 던지기 때문에, 저는 다음과 같은 것을 제안하고 싶습니다(나에게 효과가 있음, Angular 7.0.4, Typescript 3.1.6).
<div class="month" *ngFor="let item of items">
...
</div>
구성 요소 코드:
this.items = Array.from({length: 10}, (v, k) => k + 1);
색인과 함께 사용자 지정 구조 지시문 사용:
각도 설명서에 따름:
createEmbeddedView
내장된 보기를 인스턴스화하여 이 컨테이너에 삽입합니다.
abstract createEmbeddedView(templateRef: TemplateRef, context?: C, index?: number): EmbeddedViewRef
.Param Type Description templateRef TemplateRef the HTML template that defines the view. context C optional. Default is undefined. index number the 0-based index at which to insert the new view into this container. If not specified, appends the new view as the last entry.
각도가 createEmbeddedView를 호출하여 템플릿을 만들 때 내부에서 사용할 컨텍스트도 전달할 수 있습니다.ng-template
.
컨텍스트 선택적 매개 변수를 사용하면 *ngFor에서와 마찬가지로 구성 요소에서 이 매개 변수를 사용하여 템플릿 내에서 추출할 수 있습니다.
app.component.vmdk:
<p *for="number; let i=index; let c=length; let f=first; let l=last; let e=even; let o=odd">
item : {{i}} / {{c}}
<b>
{{f ? "First,": ""}}
{{l? "Last,": ""}}
{{e? "Even." : ""}}
{{o? "Odd." : ""}}
</b>
</p>
for.sys.ts:
import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';
class Context {
constructor(public index: number, public length: number) { }
get even(): boolean { return this.index % 2 === 0; }
get odd(): boolean { return this.index % 2 === 1; }
get first(): boolean { return this.index === 0; }
get last(): boolean { return this.index === this.length - 1; }
}
@Directive({
selector: '[for]'
})
export class ForDirective {
constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef) { }
@Input('for') set loop(num: number) {
for (var i = 0; i < num; i++)
this.viewContainer.createEmbeddedView(this.templateRef, new Context(i, num));
}
}
버튼을 클릭한 후 어레이의 크기를 동적으로 늘리려면 첨부된 내 다이내믹 솔루션을 확인하십시오(이렇게 질문에 대답했습니다).
필요한 변수의 할당:
array = [1];
arraySize: number;
배열에 요소를 추가하는 함수를 선언합니다.
increaseArrayElement() {
this.arraySize = this.array[this.array.length - 1 ];
this.arraySize += 1;
this.array.push(this.arraySize);
console.log(this.arraySize);
}
HTML에서 함수 호출
<button md-button (click)="increaseArrayElement()" >
Add element to array
</button>
ngFor를 사용하여 어레이를 통해 반복:
<div *ngFor="let i of array" >
iterateThroughArray: {{ i }}
</div>
내가 시도한 가장 간단한 방법은
구성 요소 파일에 배열을 생성하고 배열로 반환하여 *ngFor 디렉티브로 호출할 수도 있습니다.
이런 것들...
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-morning',
templateUrl: './morning.component.html',
styleUrls: ['./morning.component.css']
})
export class MorningComponent implements OnInit {
arr = [];
i: number = 0;
arra() {
for (this.i = 0; this.i < 20; this.i++) {
this.arr[this.i]=this.i;
}
return this.arr;
}
constructor() { }
ngOnInit() {
}
}
그리고 이 기능은 당신의 html 템플릿 파일에서 사용할 수 있습니다.
<p *ngFor="let a of arra(); let i= index">
value:{{a}} position:{{i}}
</p>
Angular를 위한 꽤 깨끗하고 간단한 것은 다음과 같습니다.
.ts에서:
max = 10;
.html에서:
<div *ngFor="let dummy of ','.repeat(max).split(','); index as ix">
- {{ix + 1}}:
</div>
간단하고 간단한 해결책이 여기에 있다고 생각합니다.
my.component.ts 파일
setArrayFromNumber(i: number) {
return new Array(i);
}
my.component.html 파일
<li *ngFor='let in of setArrayFromNumber(5); let i = index'>{{ i }}</li>
바로 그거야!
언급URL : https://stackoverflow.com/questions/36354325/angular-2-ngfor-using-numbers-instead-collections
'programing' 카테고리의 다른 글
Python 3에서 맵이 목록 대신 맵 객체를 반환하는 이유는 무엇입니까? (0) | 2023.05.06 |
---|---|
반환 유형이 없는 함수 대리자 (0) | 2023.05.06 |
명령 프롬프트 실행 명령 (0) | 2023.05.06 |
기계는 어디에 있습니까?구성? (0) | 2023.05.06 |
SQL Server에서 MSDTC를 활성화하려면 어떻게 해야 합니까? (0) | 2023.05.06 |