我有以下代码来管理用户,
@Component({
selector: 'app-user',
template: `
<input [(ngModel)]="newUser"><button (click)="addNewUser()">add</button>
<div *ngFor="let user of users$ |async">
{{user}}
</div>
`
})
export class UserComponent {
newUser: string;
users$: Observable<any>;
private _users = [];
ngOnInit() {
this.users$ = of(this._users);
}
addNewUser() {
this._users.push(this.newUser);
}
}
当我只是将新用户推送到rxjs of
中包装的this._users数组时,angular如何知道何时更新html中的this.users $?角度异步管道如何检测可观察对象内部的变化?
答案 0 :(得分:1)
您可以在此处查看源代码
https://github.com/angular/angular/blob/master/packages/common/src/pipes/async_pipe.ts
它订阅了可观察对象。
摘自源代码中的评论
async
管道订阅了Observable
或Promise
并返回其具有的最新值async
管道标记要检查的组件async
管道会自动退订以避免发生看着您的问题,您正在滥用可观察物。您不应将新值推入数组,而应使可观察对象发出新数组。 Angular更新页面的原因与可观察对象无关,但事实是您使用的是默认的更改检测策略,它会注意到数组已更改。
如果您使用的是BehaviorSubject而不是使用BehaviorSubject,则可以呼叫下一个
addNewUser() {
const users = this.users$.getValue();
this.users$.next([...users, this.newUser]);
}
Observables使您可以使用更有效的推送更改检测策略,该策略不会使用您所做的操作来更新页面。您需要用新的数组实例替换该数组,以便onPush可以检测到更改。