【发布时间】:2017-02-14 21:43:55
【问题描述】:
在我的应用中,我有一个从 API 获取用户对象的 UserService。
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
@Injectable()
export class UserService {
constructor() {
this.userSource.subscribe(user => console.log(user));
}
user:any = {
name: 'Lindsey Buckingham'
};
private userSource = new BehaviorSubject<any>(this.user);
user$ = this.userSource.asObservable();
// fetch user data from HTTP and call 'next()' on observable
}
然后我有多个组件在使用此服务。例如,个人资料页面:
import { Component } from '@angular/core';
import { UserService } from '../shared/user.service';
@Component({
selector: 'profile',
templateUrl: './profile.component.html'
})
export class ProfileComponent {
constructor(private userService:UserService) {}
private user:any = {};
ngOnInit() {
this.userService.user$.subscribe((user) => this.user = user);
}
}
现在我遇到的问题是:如果在我的配置文件组件中编辑用户对象,更改会立即传播到各处,因此所有组件都会立即收到更新的对象。我的印象是,通过订阅来自 UserService 的流,我会创建一个本地副本,如果我想更新组件中的用户对象,我会在 UserService 上使用一个调用 this.user$.next() 和 只有这样我的组件中的用户对象也会改变。但是,显然不是。
掌握 observables 的窍门,但似乎我还没有完全掌握。谁能向我解释我哪里出错了?
更新:
创建被观察对象的本地副本确实可以解决问题。
ngOnInit() {
this.userService.user$.subscribe((user) => {
let localUser = _.merge({}, user);
this.user = localUser;
});
}
【问题讨论】:
标签: angular rxjs observable