10

我有一个 Angular 2 组件,用于*ngFor呈现嵌套的数字数组。

@Component({
  selector: 'app',
  template: `
    <div *ngFor="let row in data">
      <div *ngFor="let curve in row">
        <chart [data]="curve">
      </div>
    </div>
  `,
  directives: [Chart],
})
export default class App {
  data: number[][][];
}

当我更改data时,Angular 会替换<chart>元素,即使新数组具有相同的尺寸。我只希望它更新图表的属性但保留元素(以便我可以为数据更改设置动画)。

Angular 替换元素是可以理解的,因为新数组是一个新的对象引用。但是我该如何规避呢?

4

2 回答 2

7

使用ngForTrackBy应该可以帮助你。

以下函数应更新元素属性,同时将元素保留在 DOM 中。

trackByIndex(index: number, data: any) { return index; }
于 2016-07-03T12:35:41.023 回答
2

工作小插曲

扁平数据结构

您可以将有关图表的元数据(标题、ID 等)与将要更改和动画的实际数据点分开。

*ngFor循环将使用元数据数组,并且每个图表组件都有一个@Input()从单独的数据点对象中提取的数据。

// Metadata
this.charts = [
  {
    id: 1,
    title: 'Chart Title 1',
  },
  {
    id: 2,
    title: 'Chart Title 2',
  }
];

// Data Points
this.chartData = {
  1: [87, 95, 121, 20, 60, 131, 10, 139, 128, 99],
  2: [56, 107, 107, 144, 43, 7, 67, 35, 141, 62]
}

模板

<div *ngFor="let chart of charts">
  <app-chart [inputMeta]="chart" [inputData]="chartData[chart.id]"></app-chart>
</div>

然后在您的图表组件中,您可以在更新数据点时使用ngOnChanges() 生命周期挂钩来更新图表。

于 2016-07-03T04:36:23.233 回答