2016-05-25 10 views
2

Ich versuche, eine einfache dynamische Rate von 0 bis 5 Sterne (und seine mittleren Werte wie x.5 [Beispiel 4.5]), die einen Wert von der erhält Javascript.Ionic2 + Angular2 - dynamische Rate Wert mit Ion-Icon-Star

Ich suchte nach etwas mit * ngFor, aber ich verstehe nicht, wie das funktioniert. Kann mir jemand erklären/helfen?

Wenn es hilft, für ionische, haben wir 3 Arten von Sternen zur Verfügung:

<ion-icon name="star"></ion-icon> 
<ion-icon name="star-half"></ion-icon> 
<ion-icon name="star-outline"></ion-icon> 

Zum Beispiel, wenn ich vom Server ein Wert Rate erhalten = 3,5, es macht:

<ion-icon name="star"></ion-icon> 
<ion-icon name="star"></ion-icon> 
<ion-icon name="star"></ion-icon> 
<ion-icon name="star-half"></ion-icon> 
<ion-icon name="star-outline"></ion-icon> 

I benutze Javascript, kein Typoskript.

Vielen Dank :)

p.s. wenn dieser Titel, desto besser ist nicht sicher, ist jeder Vorschlag willkommen :)

Antwort

3

Hier ist eine Möglichkeit, es zu tun:

<ion-item> 
    <ion-icon *ngIf="myRating>=1" name="star"></ion-icon> 
    <ion-icon *ngIf="myRating>=2" name="star"></ion-icon> 
    <ion-icon *ngIf="myRating>=3" name="star"></ion-icon> 
    <ion-icon *ngIf="myRating>=4" name="star"></ion-icon> 
    <ion-icon *ngIf="myRating>=5" name="star"></ion-icon> 
    <ion-icon *ngIf="myRating%1!=0" name="star-half"></ion-icon> 
    <ion-icon *ngIf="myRating==0" name="star-outline"></ion-icon> 
    <ion-icon *ngIf="myRating<=1" name="star-outline"></ion-icon> 
    <ion-icon *ngIf="myRating<=2" name="star-outline"></ion-icon> 
    <ion-icon *ngIf="myRating<=3" name="star-outline"></ion-icon> 
    <ion-icon *ngIf="myRating<=4" name="star-outline"></ion-icon> 
</ion-item> 

Es braucht mehr Platz im HTML, aber keine zusätzlichen Javascript erforderlich. Hier ist myRating der Sternwert. Ich habe es für alle 11 möglichen Werte getestet.

+0

Wow, es ist nicht der beste Weg, aber es ist eine wirklich schlaue Art und Weise, es funktioniert! Ich danke dir sehr :) –

1

Wenn Sie einen Array haben wie

value = ['star', 'star', 'star', 'star-half', 'star-outline']; 

Sie ngFor verwenden können Sie Ihre HTML wie

<ion-icon *ngFor="let icon of icons" [name]="icon"></ion-icon> 

oder abhängig zu machen auf was name ist (Eigenschaft oder Attribut)

<ion-icon *ngFor="let icon of icons" name="{{icon}}"></ion-icon> 
+0

danke für die Antwort. Könntest du mir besser erklären, wie ich einen Wert, Beispiel - 3.5, in ein Wert-Array transformiere? –

+1

Das ist, was ich dachte: https://jsfiddle.net/k4a3mw7n/ – rinukkusu

+1

Mein Ansatz https://plnr.r.co/edit/X8qc3oWPKAXhxpwe7ryt?p = Vorschau Ich berechne die Icon-Zeichenfolge aus dem aktuellen Index und dem übergebenen Wert. –

0

Eine Alternative wäre, eine Funktion mit Switch-Fall zu erstellen oder den Typ des Symbols zurückzugeben, um Code HTML zu bereinigen.

html:

<Ion-item> 
   <Ion-icon [name]="validate(myRating)"> </ion-icon> 
</Ion-item> 

Funktion:

Validate(e:string): string { 
   Let res; 
   if (e> 1){ 
   res="star"; 
    } 
    else { 
  res="star-outline"; 
    } 

   Return result; 
} 
0

ich diese Lösungen erreicht haben die Tipps, die Sie Jungs zur Verfügung gestellt:

function printRating (rating) { 

    let max_rate  = 5; 
    let rounded_rating = Math.round(rating); 
    let array_stars = new Array(max_rate); 
    array_stars.fill('star-outline'); 

    for(let i=0; i < rounded_rating; i++) { 
    array_stars[i] = 'star'; 

    if(i === rounded_rating - 1 && rating % 1 !== 0) { 
     array_stars[i] = 'star-half'; 
    } 
    } 

    return array_stars; 
} 

In meiner Komponente I zugeordnet haben zu einer Variablen das Ergebnis Array

this.stars = this.printRating(this.seller.rating); 

Und schließlich in der Ansicht gedruckt ich auf dem Ergebnis-Array basierte

<ion-icon *ngFor="let star of stars" name="{{star}}"></ion-icon> 

Hoffnung hilft dies jemand!

Verwandte Themen