Angular 5中可全局更新对象的存储方案咨询
关于共享服务与BehaviorSubject的疑问解答
嘿,咱直接针对你的问题拆解解答,结合前端(尤其是Angular这类常用BehaviorSubject的框架)实践给你说清楚:
一、共享服务存储facts对象,完全能实现增改查操作
当然可以!共享服务就是用来在应用全局共享状态和数据的绝佳方式。你可以在服务里维护这个facts对象,同时提供对应的方法来实现查询(获取当前对象)、修改属性、新增键值对的操作。如果要让组件能实时感知到数据变化,结合BehaviorSubject是非常合适的方案——它能把数据包装成可观察流,让订阅的组件自动更新视图。
二、BehaviorSubject的.next()方法会不会销毁当前对象?
这里要分两种情况来看:
- 直接修改原对象属性后调用.next(原对象):这种情况里,原对象并没有被销毁,但因为对象的引用没变化,
BehaviorSubject的订阅者不会收到更新通知(因为Observable默认是引用比较)。 - 创建新对象后调用.next(新对象):这种情况里,原对象不会被销毁(只要还有其他地方引用它,垃圾回收就不会清掉它),
BehaviorSubject只是把新的对象推送到流里,订阅者会拿到新的对象引用。
完整的实现示例
下面给你写一个具体的共享服务代码,结合API获取、增改查操作和BehaviorSubject的使用:
import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; import { HttpClient } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) export class FactsService { // 用BehaviorSubject维护facts的可观察流,初始值设为空对象 private factsSubject = new BehaviorSubject<{[key: string]: any}>({}); public facts$: Observable<{[key: string]: any}> = this.factsSubject.asObservable(); constructor(private http: HttpClient) { // 初始化时从API获取facts数据 this.fetchFactsFromApi(); } private fetchFactsFromApi(): void { this.http.get<{[key: string]: any}>('你的API地址').subscribe(facts => { this.factsSubject.next(facts); }); } // 同步获取当前facts对象(返回副本,避免外部直接修改原对象) getCurrentFacts(): {[key: string]: any} { return {...this.factsSubject.value}; } // 修改单个属性,比如把name改成'nick' updateFactProperty(key: string, value: any): void { const currentFacts = {...this.factsSubject.value}; // 创建原对象的副本 currentFacts[key] = value; this.factsSubject.next(currentFacts); // 推送新对象到流中 } // 新增键值对,比如添加hobbies:'swimming' addFactProperty(key: string, value: any): void { const currentFacts = {...this.factsSubject.value}; if (!currentFacts.hasOwnProperty(key)) { currentFacts[key] = value; this.factsSubject.next(currentFacts); } } }
组件中使用的示例
import { Component, OnInit } from '@angular/core'; import { FactsService } from './facts.service'; @Component({ selector: 'app-facts', template: ` <div>Name: {{ facts?.name }}</div> <div>Age: {{ facts?.age }}</div> <button (click)="changeName()">改成Nick</button> <button (click)="addHobby()">添加游泳爱好</button> ` }) export class FactsComponent implements OnInit { facts: {[key: string]: any} | undefined; constructor(private factsService: FactsService) {} ngOnInit(): void { // 订阅facts的变化,实时更新组件视图 this.factsService.facts$.subscribe(facts => { this.facts = facts; }); } changeName(): void { this.factsService.updateFactProperty('name', 'nick'); } addHobby(): void { this.factsService.addFactProperty('hobbies', 'swimming'); } }
总结一下
- 共享服务完全可以实现你需要的全局数据共享和增改查操作,结合
BehaviorSubject还能实现响应式更新。 - 使用
BehaviorSubject.next()时,只要你是创建新对象(比如用扩展运算符...复制原对象再修改),原对象不会被销毁,只是流里的引用换成了新对象,订阅者能收到更新;如果直接修改原对象再next,订阅者不会感知到变化,这是需要注意的点。
内容的提问来源于stack exchange,提问作者Smokey Dawson
相关产品推荐
相关产品推荐

