我有一个父页面,它将user
数据传递给子组件,如下所示:
<ng-container *ngIf="leaderboard">
<app-leaderboard-preview [user]="user" (click)="goToLeaderboard()"></app-leaderboard-preview>
</ng-container>
父页面ngOnInit()
订阅了一个可观察对象,该对象返回一个用户对象并设置了user
变量(我从combineLatest
中删除了其他不相关的查询):
combineLatest([this.userQuery$]).subscribe((results) => {
Promise.all([this.parseUser(results[4])])
})
据我了解,除非创建新对象,否则ngOnChanges()
不会触发,因此我将新用户对象分配为新对象,以使用app-leaderboard-preview
传递给Object.assign()
组件。
parseUser(user) {
return new Promise((resolve) => {
if(user) {
this.user = Object.assign({}, user);
resolve(user);
} else {
resolve(user);
}
})
}
这样可以很好地加载组件,但是用户的排名可以更改,因此当用户向下滑动以刷新页面时,应该更新该值,但是该组件不会更新。我使用以下代码(与上面几乎一样的副本)刷新页面(无需重新加载)。
doRefresh(event) {
if (this.user) {
//user
this.userQuery$ = this.db.query$(`user/find?id=${this.user.id}`);
combineLatest([this.userQuery$]).subscribe((results) => {
Promise.all([this.parseUser(results[4])])
})
}
然后运行parseUser
方法来更新user
使用的app-leaderboard-preview
对象。
所以这应该触发ngOnChanges,因为我正在将“新”对象传递给组件。我想念什么?
答案 0 :(得分:1)
修改
约旦来回弄清楚他有一个异步管道分配给用户变量,该变量覆盖了他对this.user的更改。
*ngIf = user$ | async as user
原始答案
Object.assign({},object)应该可以工作。在Angular 7上进行了测试。
this.user = Object.assign({}, user);
..或者如果您使用lodash,就可以。
this.user = _.clone(user);
this.user = _.cloneDeep(user);
https://lodash.com/docs/4.17.11#clone
https://lodash.com/docs/4.17.11#cloneDeep
Stackblitz演示: https://stackblitz.com/edit/ngonchangeswithobject
答案 1 :(得分:0)
我之前也遇到过同样的问题,并且好奇是否有人知道如何解决。
我解决这个问题的方法是在我的输入变量上使用get()set()方法。这不是一个很好的解决方案,特别是如果您有多个输入变量。
private _user: any;
@Input()
set user(value: any) {
this._user = value;
// run ngOnChanges stuff here
this.ngOnChanges();
}
get user(): any {
return this._user;
}