Angular - 未通过变化检测注册的对象的值变化
Angular - Value change of object not registering through change detection
我对学习 Angular 还比较陌生,并已按照 PluralSight 演示中的一些说明设置基本服务、组件和 HTML 页面。
当我运行我的服务和调试时,我可以看到该服务成功地检索了我需要的数据。但是,HTML 的一部分似乎没有经过更改检测。我显示的日期属性成功地做到了这一点,但是我的数组只是被忽略了。
我试过显式创建一个单独的数组并分配给另一个变量,这也没有用。我缺少有关 ngModel 和更改检测的内容吗?
服务:
@Injectable({
providedIn: 'root'
})
export class RankingService {
private rankingUrl = 'https://localhost:44381/api/Ranking'
constructor(private http: HttpClient) { }
getRanking(): Observable<IRanking> {
return this.http.get<IRanking>(this.rankingUrl)
.pipe(
tap(data => console.log('All: ' + JSON.stringify(data))),
catchError(this.handleError)
);
}
HTML:
<div class='row'>
{{'Last Updated: ' + ranking?.startDateTime}}
</div>
<table class='table' *ngIf='ranking'>
<thead>
<tr>
<th>Rank</th>
</tr>
</thead>
<tbody>
<tr *ngFor='let position of ranking.rankpositions?.slice(0,30)'>
<td>
{{ position.Rank }}
</td>
</tr>
</tbody>
</table>
组件:
export class RankingListComponent implements OnInit {
errorMessage = '';
ranking: IRanking;
constructor(private rankingService: RankingService) { }
ngOnInit(): void {
this.rankingService.getRanking().subscribe({
next: ranking => {
this.ranking = ranking;
},
error: err => this.errorMessage = err
});
}
}
IRanking 是一个接口,带有一个 rankPositions 数组(代表另一个接口)。
作为输出,我得到了这个(我删除了一些 HTML 元素,以使代码段更小):
在控制台中,我清楚地填充了 rankpositions 数组:
你打错了,所以应该关闭。
但除此之外,运行在模板中使用类似的函数几乎总是会导致更改检测问题。在此处使用 slice
管道进行快速修复:
<tr *ngFor='let position of ranking.rankPositions | slice:0:30'>
IMO 更好的解决方法是切换到 async
管道并使用 rx 运算符 运行 你的切片。
一般 angular 最佳做法是不要 运行 模板中的函数,在适当的时候使用管道,但通常你的函数应该 运行 在你的组件控制器中。
请将rankpositions
改为rankPositions
我对学习 Angular 还比较陌生,并已按照 PluralSight 演示中的一些说明设置基本服务、组件和 HTML 页面。
当我运行我的服务和调试时,我可以看到该服务成功地检索了我需要的数据。但是,HTML 的一部分似乎没有经过更改检测。我显示的日期属性成功地做到了这一点,但是我的数组只是被忽略了。
我试过显式创建一个单独的数组并分配给另一个变量,这也没有用。我缺少有关 ngModel 和更改检测的内容吗?
服务:
@Injectable({
providedIn: 'root'
})
export class RankingService {
private rankingUrl = 'https://localhost:44381/api/Ranking'
constructor(private http: HttpClient) { }
getRanking(): Observable<IRanking> {
return this.http.get<IRanking>(this.rankingUrl)
.pipe(
tap(data => console.log('All: ' + JSON.stringify(data))),
catchError(this.handleError)
);
}
HTML:
<div class='row'>
{{'Last Updated: ' + ranking?.startDateTime}}
</div>
<table class='table' *ngIf='ranking'>
<thead>
<tr>
<th>Rank</th>
</tr>
</thead>
<tbody>
<tr *ngFor='let position of ranking.rankpositions?.slice(0,30)'>
<td>
{{ position.Rank }}
</td>
</tr>
</tbody>
</table>
组件:
export class RankingListComponent implements OnInit {
errorMessage = '';
ranking: IRanking;
constructor(private rankingService: RankingService) { }
ngOnInit(): void {
this.rankingService.getRanking().subscribe({
next: ranking => {
this.ranking = ranking;
},
error: err => this.errorMessage = err
});
}
}
IRanking 是一个接口,带有一个 rankPositions 数组(代表另一个接口)。
作为输出,我得到了这个(我删除了一些 HTML 元素,以使代码段更小):
在控制台中,我清楚地填充了 rankpositions 数组:
你打错了,所以应该关闭。
但除此之外,运行在模板中使用类似的函数几乎总是会导致更改检测问题。在此处使用 slice
管道进行快速修复:
<tr *ngFor='let position of ranking.rankPositions | slice:0:30'>
IMO 更好的解决方法是切换到 async
管道并使用 rx 运算符 运行 你的切片。
一般 angular 最佳做法是不要 运行 模板中的函数,在适当的时候使用管道,但通常你的函数应该 运行 在你的组件控制器中。
请将rankpositions
改为rankPositions