Angular 2 - Ng不更新视图

时间:2018-03-20 09:13:25

标签: javascript angular components ngfor

我正在开展角度2项目,当我尝试更改列表时遇到问题。 Ng不识别更改,仅显示第一次加载的列表。

这是一个示例代码,当我加载所有列表并在加载后立即重置它与null。视图仍然显示所有列表...

这是我的组件构造函数,例如:

 constructor( private songService : SongService)
    this.songService.getSongs()
         .subscribe(songsList => {
             this.songs = songsList;
         });

    this.songs = null;

}

这是html:

<div class="row">
    <div  *ngFor= "let song of songs" class="col-md-4">
     <app-song-item [song]="song"></app-song-item>
    <br>
    </div>
</div>

4 个答案:

答案 0 :(得分:3)

Angular中的循环有时会搞砸,就像他们不按照您希望的方式跟踪您的项目一样。

为了防止这种情况,您可以按照此功能使用自定义曲目

<div *ngFor="let song of songs; let i = index; trackBy: customTB" class="col-md-4">

在您的TS中

customTB(index, song) { return `${index}-${song.id}`; }

通过这种方式,您可以设置自定义trackBy功能,该功能将更新您的视图(由于跟踪ID未发生变化,因此视图未获得更新)。

答案 1 :(得分:1)

而不是null,你应该设置一个空数组,也将它放在一个方法中,否则它永远不会被调用

 this.songService.getSongs()
         .subscribe(songsList => {
             this.songs = songsList;
         });
clear(){
    this.songs = [];
}

答案 2 :(得分:1)

您仍然看到列表的原因是它是异步的。您无法确定何时执行subscribe方法。它可以是直接的,在几秒钟内,需要几个小时甚至根本不需要。因此,在您的情况下,您甚至在获得列表之前重置列表。

constructor( private songService : SongService)
  this.songService.getSongs()
    .subscribe(songsList => { //Might take a while before executed.
      this.songs = songsList;
    });

  this.songs = null; //executed directly
}

以上解释可能是您的问题的原因,但也可能有另一种解释。仅在创建组件时调用构造函数。更改路由器参数不一定会创建组件。如果可以,Angular可能会重新使用该组件。

答案 3 :(得分:-1)

试试这个

constructor(private songService: SongService) {
    this.songService.getSongs()
        .subscribe(songsList => {
            this.songs = songsList;
            this.reset();
        });
}

reset() {
    this.songs = [];
}