2016-04-10 15 views

Antwort

49

könnten Sie Folgendes verwenden:

@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; 
} 

Oder ein eigenes Rohr implementieren:

@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; 
} 
+1

Die FillPipe-Klasse muss PipeTransform implementieren – toumir

+1

Ja, Sie haben Recht! Es ist besser ;-) Danke, dass du darauf hingewiesen hast. Ich habe meine Antwort entsprechend aktualisiert ... –

+0

Ich wusste nicht, dass ich eine benutzerdefinierte Pipe erstellen müsste. Dachte, es wäre in eckigen 2 eingebaut worden, aber deine Anregung funktioniert perfekt. Vielen Dank! – takeradi

15

Sie können dies einfach tun, in Ihrem HTML:

*ngFor="let number of [0,1,2,3,4,5...,18,19]" 

und die Variable verwenden "Nummer" zum Indexieren.

+0

OP sagte, dass er '20' einer Membervariable zugewiesen hat. Das hilft also nicht viel – Blauhirn

0

einfacherer Ansatz:

eine helperArray definieren und instanziiert dynamisch (oder statisch, wenn Sie wollen) mit der Länge der Zählung, die Sie Ihre HTML-Elemente erstellen möchten. Ich möchte zum Beispiel einige Daten vom Server abrufen und Elemente mit der Länge des zurückgegebenen Arrays erstellen.

export class AppComponent { 
    helperArray: Array<any>; 

    constructor(private ss: StatusService) { 
    } 

    ngOnInit(): void { 
    this.ss.getStatusData().subscribe((status: Status[]) => { 
     this.helperArray = new Array(status.length); 
    }); 
    } 
} 

Dann verwenden Sie die helperArray in meiner HTML-Vorlage.

<div class="content-container" *ngFor="let i of helperArray"> 
    <general-information></general-information> 
    <textfields></textfields> 
</div> 
12

Es gibt zwei Probleme mit den empfohlenen Lösungen mit Arrays:

  1. Es ist verschwenderisch. Insbesondere für große Zahlen.
  2. Sie müssen sie irgendwo definieren, was viel Unordnung für solch eine einfache und allgemeine Operation ergibt.

Es scheint effizienter, ein Pipe (einmal) zu definieren, Return ein Iterable:

import {PipeTransform, Pipe} from '@angular/core'; 

@Pipe({name: 'times'}) 
export class TimesPipe implements PipeTransform { 
    transform(value: number): any { 
    const iterable = {}; 
    iterable[Symbol.iterator] = function*() { 
     let n = 0; 
     while (n < value) { 
     yield ++n; 
     } 
    }; 
    return iterable; 
    } 
} 

Anwendungsbeispiel (ein Gitter mit dynamischer Breite Rendering/Höhe):

<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> 
+1

Das ist unglaublich nützlich. – Mordred

+0

Genau das, was ich gesucht habe. Und es ist auch effizient, wie Sie in Ihrem Intro erwähnt haben. –

5

A einfacher und eine wiederverwendbare Lösung vielleicht, um kundenspezifische strukturelle Richtlinie wie diese zu verwenden.

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); 
    } 
    } 

} 

Und es wie folgt verwenden:

<span *appTimes="3" class="fa fa-star"></span> 
+0

für weitere Informationen: https://netbasal.com/the-power-of-structural-directives-in-angular-bfe4d8c44fb1 –

6
<div *ngFor="let dummy of ' '.repeat(20).split(''), let x = index"> 

ersetzen 20 mit variablen

+0

Ich wünschte, ich könnte die richtige Antwort zu markieren. – hamzox

Verwandte Themen