【发布时间】:2017-11-06 11:27:37
【问题描述】:
(我正在重构我的问题,因为我认为第一个问题非常令人困惑......)
我正试图弄清楚 Observables 在 Angular 2 / 4 中是如何工作的。具体来说,我想在组件初始化时订阅服务的 Observable,然后在组件的生命周期后期我想在没有它的情况下修改数据影响 observable 或其他订阅者。我将数据存储在组件上的变量中,但是当我修改它时,Observable 的其他订阅者也会显示更改。
在我的代码中,有三个可观察对象:客户、项目和用户。现在我只是想修改 Observable 项目中的数据。我将数据用作 ng2-ui 自动完成的来源,所以我不能按照下面评论中的建议使用 *ngFor。
common.service.ts(创建可观察对象)
import { Observable } from 'rxjs'
import { BehaviorSubject } from 'rxjs';
export class UserService {
public clients: BehaviorSubject<any> = new BehaviorSubject(null);
public projects: BehaviorSubject<any> = new BehaviorSubject(null);
public user: BehaviorSubject<any> = new BehaviorSubject(null);
constructor(){};
}
login.ts(订阅 Observable,从 API 获取数据,然后将其传递给 Observables)
ngOnInit() {
this.userService.clients.subscribe();
this.userService.projects.subscribe();
}
userLogin() {
this.commonService.request('login', 'post', '', {password: this.password, email: this.email})
.then((response:any) => {
if(response.token) {
this.configService.token = response.token;
if(response.clients) this.userService.clients.next(response.clients);
if(response.projects) this.userService.projects.next(response.projects);
this.configService.loggedIn = true;
this.router.navigate(['dashboard']);
}
})
}
component.ts(订阅,从 Observable 中获取数据然后修改)
ngOnInit() {
this.userService.clients.subscribe((clients) => {
this.clients = clients;
});
this.userService.projects.subscribe((projects) => {
this.projects = projects;
});
this.filteredProjects = this.projects;
this.filteredClients = this.clients;
}
filterProjects(client) { // When a client is selected
this.filteredProjects.forEach((project) => {
if(client.projects.indexOf(project._id) == -1) {
filteredProjects.splice(project._id, 1) // this splices the filteredProjects array, but also this.projects and any other subscriptions to the observable in the app.
}
});
}
当我过滤 this.filteredProjects 时,this.projects 也会被修改。我可以通过两个对象的 console.logs 看到这一点,也因为另一个组件正在订阅可观察的项目,而这个另一个组件也显示了更改。
但是,如果我不过滤 this.filteredProjects,而只是说 this.filteredProjects = [];,那么 this.projects 将保持不变。
如何在不影响可观察对象或其其他订阅者的情况下修改可观察对象的数据?
【问题讨论】:
标签: angular observable angular2-observables