2016-05-24 13 views
6

Ich habe eine Komponente, die eine count und eine color Eigenschaft hat. Die Komponente soll count Nummer <div> s mit einem Inline-Stil anzeigen, der verwendet wird, um seine Farbe in zu ändern.Angular2 Komponenten - Dynamische Inline-Stile

Hier ist, was ich bisher habe:

@Component({ 
    selector: 'my-control', 
    template: `<div *ngFor="let i of dummyArray" style="color: {{color}}"> COLOR = {{color}}</div>` 
}) 
export class MyControl { 
    private _count: number; 
    @Input() set count(value: string) { 
     this._count = +value; 
    } 
    @Input() set color(value: string) { 
     this._color = value; 
    } 
    get dummyArray(): number[] { 
     let ret: number = []; 
     for (let i = 0; i < this._count; ++i) ret.push(i); 
     return ret; 
    } 
    get color(): string { 
     return this._color; 
    } 
} 

Dies macht:

<my-control count="5" color="red"> 
    <div>COLOR = red</div> 
    <div>COLOR = red</div> 
    <div>COLOR = red</div> 
    <div>COLOR = red</div> 
    <div>COLOR = red</div> 
</my-control> 

Jetzt habe ich zwei Probleme mit diesem:

  1. Gibt es eine bessere Art und Weise zu machen, die <div> s count mal ohne ein Dummy-Array zu erstellen?

  2. Noch wichtiger ist, dass die Inline-Stile nicht festgelegt werden. Wenn ich Stile wie style="color: red" fest codiere, funktioniert es. Aber style="color: {{color}}" nicht. Das Element wird ohne Stile wiedergegeben, wie Sie oben sehen können.

    @Input() set count(value: string) { 
        this._count = +value; 
        this.update(); 
    } 
    @Input() set color(value: string) { 
        this._color = value; 
        this.update(); 
    } 
    update(): void { 
        for (let i = 0; i < this._count; ++i) { 
         this.renderer.setElementStyle(this.elRef.nativeElement.children[i], 'color', this._color); 
        } 
    } 
    

    Aber ich bekomme Ausnahme der untergeordneten Elemente zugreifen, da sie scheinbar nicht vorhanden ist:

Für # 2, ich habe auch die nativeElement ‚s Kinder auch versucht, mit.

Wie soll ich diese Probleme lösen?

+0

Es gibt keine Möglichkeit, zu uns 'ngFor' ohne ein Array. Sie könnten Ihre benutzerdefinierte 'ngFor'-Anweisung erstellen, die das tut. Es gibt ein Problem, 'ngFor' mit einer Nummer anstelle eines Arrays zu unterstützen, aber es ist unwahrscheinlich, dass es implementiert wird. –

+0

danke für den Tipp Kumpel .. das saugt aber .. macht für eine plumpe Implementierung von Komponenten in solchen Fällen .. – AweSIM

+1

Ihr Code kann ein wenig optimiert werden. Siehe http://stackoverflow.com/questions/36535629/repeat-html-element-multiple-times-using-ngfor-based-on-a-number –

Antwort

15
<div *ngFor="let i of dummyArray" style="color: {{color}}> 

fehlt die Schließung " nach color}}

Bindung auf diese Weise Stil sollte vermieden werden, weil es nicht in allen Safari-Versionen (vielleicht auch andere) funktioniert.

Stattdessen verwenden

<div *ngFor="let i of dummyArray" [ngStyle]="{'color': color}"> 
+1

entschuldigung .. ich verpasste die endung '" 'versehentlich hier .. das Problem bleibt immer noch .. lassen Sie mich die' [ngStyle] = "{'Farbe ': color} "' thingy und berichte zurück .. – AweSIM

+1

WORKS! =) DANK =) – AweSIM

+2

das ist das schnellste ive, das je eine Antwort bekommen hat ..Ich zähle Minuten, um das als die richtige Antwort markieren zu können .. =) – AweSIM

3

Über Ihre erste Frage:

mit zehn undefined Elemente eines Arrays zu erstellen, könnten Sie tun:

@Component({ 
    selector: 'my-app', 
    template: `<div *ngFor="let i of arr(10); let index=index">hello {{index}}</div>` 
}) 
export class AppComponent { 
    arr=Array; 
} 

check this plunk

+0

danke für den Tipp Kumpel .. leider kann ich nur eine Antwort als richtig akzeptieren Antwort ... Und Gunters ist korrekter, da er das dringlichere Problem beantwortet .. = ( – AweSIM

+1

) Du bist willkommen @AweSIM. Ich stimme völlig zu Gunters Antwort ist die richtige. Auch die Sprenggeschwindigkeit seiner Antwort muss gezählt werden :) . Es ist nur so, dass ich eine Ergänzung zu seiner Antwort hatte und sie gepostet habe. Und nun sehe ich, dass er Ihre Frage zu dem Thema, das ich beantwortet habe, bereits kommentiert hat: D – Abdulrahman

Verwandte Themen