angular - BehaivorSubject 不保留数组和重复
问题描述
我有一个服务和一个组件,当我添加一个保留在数组中的值时,但是当我添加其他值时,我的第一个值将值更改为第二个
服务
export class PrepayService {
private _carts: BehaviorSubject<ShoppingCart[]>;
carts : Observable<ShoppingCart[]>
dataStore :{
carts: ShoppingCart[]
};
constructor() {
this.dataStore = { carts: []};
this._carts = <BehaviorSubject<ShoppingCart[]>>new BehaviorSubject([]);
this.carts = this._carts.asObservable();
}
addData(dataObj:ShoppingCart) {
this.dataStore.carts.push(dataObj);
this._carts.next(Object.assign({}, this.dataStore).carts);
}
}
零件
export class TableQuoteComponent implements OnInit {
@Input() quote: QuoteSingle = {};
cart: ShoppingCart;
serviceSelected : string;
constructor(private cartService: PrepayService) { }
ngOnInit() {
}
onSubmitAdd(){
this.cart = {};
this.cart = this.quote;
this.cartService.addData(this.cart);
}
}
第二部分
export class PrePayComponent implements OnInit {
carts: ShoppingCart[];
constructor(private cartService: PrepayService) { }
ngOnInit() {
this.cartService.carts.subscribe(carts => this.carts = carts);
console.log(this.carts);
}
}
解决方案
我认为这是一个参考价值。
Object.assign({}, this.dataStore)
将按值复制而不是引用属性的第一个深度。所以购物车不会按值复制,而是按引用复制。所以我假设这里发生的事情是您添加一个新的“报价”并添加到购物车中,该购物车将添加到主题流中。但是,当您重新分配时,this.quote
您也会更改 dataStore 中的值,从而更改主题,因为它是通过引用复制的。
要解决此问题,请修改服务的 addData() 方法,如下所示:
this.dataStore.carts.push(deepCopy(dataObj); // Here we need to deep copy the ShoppingCart. I don't know what your structure looks like. JSON.parse(JSON.stringify(dataObj)) will work for a cheap and easy deep copy.
this._carts.next(deepCopy(this.dataStore.carts)); // Deep copy the carts object here.
抱歉,我不太擅长解释事情,但基本上这是您遇到的参考问题。发生很多。其他人可能有更好的解决方案。
推荐阅读
- c# - 如何在 Visual Studio 中检索工具窗口的位置
- android - 为什么 Flutter 的 withNewEngine 无法识别?
- css - 纯 CSS 标签 div,带有圆角三角形指针
- html - 我可以在输入占位符中放置一个 inside 吗?
- javascript - webpack v5 SourceMapDevToolPlugin“排除”选项不起作用
- python - Nuke Python 在没有 scriptOpen 和 scriptClose 的情况下多次运行相同的脚本/节点?
- jenkins - 在 Jenkins 中使用全局共享库来定义参数选项
- javascript - 如何关闭要由单独的 svg 文件读取的标签
- php - Firebase accounts.signInWithIdp 不提供 id 令牌
- swiftui - 用于自定义视图的 SwiftUI ViewModifier