2016-05-20 4 views
0

Ich bin dabei, eine Lösung zu finden.Einfache Mathematik auf Modellfelder in Angular2

Ich habe das folgende Modell, geladen über ein Versprechen durch einen Dienst.

export class Something { 
    id: number; 
    someTime: string; 
    items: [ 
    { 
    id: number; 
    description: string; 
    unit: string; 
    portion: number; 
    std: number; 
    } 
    ] 
} 

Es Mock Daten hat:

const SOMETHINGS: Something[] = [ 
{ 
    id: 0, 
    someTime: 'Now', 
    items: [ 
     { 
     id: 0, 
     description: 'A', 
     unit: 'ml', 
     portion: 275, 
     std: 64 
     }, 
     { 
     id: 1, 
     description: 'B', 
     unit: 'g', 
     portion: 50, 
     std: 378 
     }, 
     .... 
    ] 
    } 
] 

Die tatsächlichen Werte sind irrelevant, aber ich brauche jeden Abschnitt und std Werte zuzugreifen. Multipliziere sie und summiere sie schließlich zusammen.

Wie so:

275 * 64 = 17600 
50 * 378 = 18900 
total = 36500 

In meiner Komponente Ich mag so die zurückgegebenen Daten zu einem lokalen Array zugeordnet habe.

Dieser Wert befindet sich nicht in einem wiederholten Abschnitt meiner Vorlage, so dass ich keinen Ansatz vom Typ * ngFor verwenden kann.

Es wäre logisch erscheinen, etwas zu verwenden, wie:

calcTotal(){ 
let totals:array<Number>; 
let gross:number = 0; 

this.something.forEach((items) => total.push(items.portion * items.std)); 

totals.forEach((total:number) => gross += total)); 

return { 
    total: totals; 
} 

}

Aber das funktioniert nicht ..

ich einfach nicht wissen, wie die einzelnen Elemente zugreifen und Auszug die zwei Werte multiplizieren sie, speichern sie für später extrahieren das nächste Paar und so weiter. Dann nimm endlich alle Ergebnisse und summiere sie und übergebe sie zur Ansicht.

Jede Hilfe wäre willkommen.

Steve

Antwort

1

Sie können dies tun, wenn Sie Ihre Daten erhalten und sie von Ihrem Service abonnieren.

this.somethingService.getSomething() 
.then((data) => { 
    this.data = data; 
    this.totals = this.calculateValues(data); 
}); 

// With the model you have up there it would look like this. 
calculateValues(data){ 
    let total = 0; 
    data.map(somethingObj => { 
    somethingObj.items.map(itemObj => { 
     total += (itemObj.portion * itemObj.std); 
    }) 
    }) 
    return total; 
} 
+0

Danke für Ihre Antwort. Zwei Punkte - zuerst verwende ich Promises in meinem Service Ich bin nicht vertraut mit der Subscribe-Methode, und Ihre Methoden scheinen nichts zurückzugeben. Fehle ich etwas Offensichtliches hier? – Steve

+0

Vergessen Sie oben, ich habe Ihre calculateValues-Methode innerhalb einer Utility-Klasse ähnlicher mathematischer Operationen verwendet. – Steve