2017-06-17 49 views
1

组件:角2个通过数据转换成一个for循环

import { Component, OnInit, Input } from '@angular/core'; 
import * as _ from "lodash"; 

import { AF } from '../angularfire.service'; 

@Component({ 
    selector: 'app-record-chart', 
    templateUrl: './record-chart.component.html', 
    styleUrls: ['./record-chart.component.less'] 
}) 
export class RecordChartComponent implements OnInit { 
    chartFilter = "Personal Records"; 
    // Fill Arrays 
    currentUser = []; 
    userRecords = []; 
    topRecords = []; 
    topRecordLabels = []; 
    topRecordWeights = []; 
    lineRecords = []; 
    public lineRecordWeights:Array<number[]> = []; 
    public lineRecordLabels:Array<any> = []; 
    movements = [ 
    "Back Squat", 
    "Bench Press", 
    "Clean", 
    "Clean & Jerk", 
    "Deadlift", 
    "Front Squat", 
    "Jerk", 
    "Power Clean", 
    "Power Snatch", 
    "Push Press", 
    "Snatch", 
    "Strict Press" 
    ]; 
    movementCharts = [ 
    "Personal Records", 
    "Back Squat", 
    "Bench Press", 
    "Clean", 
    "Clean & Jerk", 
    "Deadlift", 
    "Front Squat", 
    "Jerk", 
    "Power Clean", 
    "Power Snatch", 
    "Push Press", 
    "Snatch", 
    "Strict Press" 
    ]; 

    constructor(private afService: AF) { 
    // Get current user details. 
    afService.getCurrentUserInfo().then(currentUserDetails => { 
     this.currentUser.push(currentUserDetails); 
    }).then(() => { 
     // Populate lifts array 
     for(let movement of this.movements) { 
     this.afService.getRecords(movement, this.currentUser[0].userID).subscribe((data) => { 
      // Sort Arrays 
      var sortedArray = _.orderBy(data, ['weight']); 
      var sortedArray2 = _.orderBy(sortedArray,'date'); 
      this.userRecords.push(sortedArray); 

      // Filter by PR 
      var newRecords = sortedArray 
      .filter(function(record) { 
       return sortedArray.find(function(innerRecord) { 
        return innerRecord.name === record.name && innerRecord.weight > record.weight; }) === undefined; 
      }); 
      var newRecords2 = sortedArray2 
      .filter(function(record) { 
       return sortedArray2.find(function(record) { 
        return record.movement === "Back Squat"; }); 
      }); 

      // Build array of PR's 
      for (let record of newRecords) { 
      this.topRecords.push(record); 
      } 

      // Build array of PR's 
      for (let record of newRecords2) { 
      this.lineRecords.push(record); 
      } 
     }); 
     } 
    }).then(() => { 
     // Push labels and weights to chart. 
     setTimeout(() => { 
     for (let item of this.topRecords) { 
     this.topRecordLabels.push(item.movement); 
     this.topRecordWeights.push(item.weight); 
     } 
     this.topRecordLabels = this.topRecords.map((item)=> item.movement); 
     this.topRecordWeights = this.topRecords.map((item)=> item.weight); 

     for (let item of this.lineRecords) { 
     this.lineRecordLabels.push(item.date); 
     this.lineRecordWeights.push(item.weight); 
     } 
     this.lineRecordWeights = this.lineRecords.map((item)=> item.weight); 
    }, 300) 
    })} 

    ngOnInit() { 
    } 

} 

组件部分集中在:

var newRecords2 = sortedArray2 
      .filter(function(record) { 
       return sortedArray2.find(function(record) { 
        return record.movement === "Back Squat"; }); 
      }); 

HTML:

<div class="content-actions btn-group"> 
    <select class="form-select record-select" [(ngModel)]="chartFilter"> 
     <option *ngFor="let movement of movementCharts">{{ movement }}</option> 
    </select> 
    <button class="btn btn-primary" type="button" routerLink="/add-record">Add Record</button> 
    </div> 

我需要替换的"Back Squat"串组件与ngModel chartFilter,但我不知道如何去传递一个动态变化的值为一个for循环。无论何时通过菜单<select>选择新项目,该值都会更改。

+0

与替换' “后深蹲”'? – Aravind

+0

this.chartFilter –

回答

3

更新

您应该使用[ngValue]如下,

<select [(ngModel)]="chartFilter"> 
     <option *ngFor="let type of movementCharts" [ngValue]="type"> {{type}}</option> 
     </select> 

更新1:基于聊天

如果你想明确地处理该事件时,下拉改变你应该使用ngModelChange()事件如下,

<select [ngModel]="chartFilter" (ngModelChange)="eventHanler($event)"> 
     <option *ngFor="let type of movementCharts" [ngValue]="type"> {{type}}</option> 
     </select> 

打字稿代码:

eventHanler(movement){ 
    //// do what ever you want 

} 

注意:更新的演示相应

LIVE DEMO

+0

什么?这没有任何意义。数组是从这一行动态构建的:'return record.movement ===“Back Squat”;'。因此为什么我需要将“Back Squat”设置为ngModel。该值有13种不同的可能性。 –

+0

您想用'this.chartFilter'正确替换''Back Back Squat''。或者你想''PersonalSquats''预先填好它? – Aravind

+0

是的,'“Back Squat”在for循环中,而不是在预设数组中。 –

0

我觉得有点难以理解。基本上你想for循环运行此每当在选择的值发生变化,但随后而不是把这些代码在构造函数部分,你为什么不使用ngModelChange和一个函数分配给它,就像提到@aravind。