加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Angular 2 – 使用ngFor,是否可以在不重建dom的情况下更新值?

发布时间:2020-12-17 07:49:22 所属栏目:安全 来源:网络整理
导读:我在ngFor中有一个组件’bar’.我想用从前一个值到新值的动画更新其宽度. HTML: div *ngFor="let station of stations" class="station" bar [perc]="station.perc" class="bar"/bar/div ParentComponent: ngOnInit(){ setInterval(() = this.updateData()
我在ngFor中有一个组件’bar’.我想用从前一个值到新值的动画更新其宽度.

HTML:

<div *ngFor="let station of stations" class="station">
    <bar [perc]="station.perc" class="bar"></bar>
</div>

ParentComponent:

ngOnInit(){
    setInterval(() => this.updateData(),10000);
  }

  updateData(){
    const url = 'http://....';
    this.http.get(url)
      .map(res => res.json())
      .subscribe(data => {

        this.stations = data;

      });
  }

BarComponent

export class BarComponent {

  @Input() perc;

  constructor(private element: ElementRef){}

  ngOnChanges(changes: any): void {
    let perc = changes.perc.currentValue;
    TweenMax.to(this.element.nativeElement,1,{ width: perc + '%' });
  }

}

但是在每个updateData()上,它看起来像ngFor重新创建dom并再次构造BarComponent.因此,即使’station.perc’相同,也会触发ngOnChanges().

并且转换从0开始重新开始,而不是从之前的值开始…

我可能错过了一个关键点,但是干净的解决方法是什么?

我想你应该使用trackBy选项来定制ngFor指令的默认跟踪算法:

视图

<div *ngFor="let station of stations; let i = index; trackBy: trackByFn" class="station">
  <bar [perc]="station.perc" class="bar"></bar>
</div>

零件

trackByFn(index,item) {
  return index;
}

或者更好地使用唯一ID:

trackByFn(index,station) {
  return station.id;
}

在这里查看有关trackBy的更多详细信息:

> https://angular.io/guide/template-syntax#ngfor-with-trackby

希望Plunker Example也会帮到你.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读