angular - 不相关组件之间的角度通信
问题描述
我有两个不相关的组件 CartComponent 和 CheckoutComponent。我想将数据从 CartComponent 传递给 CheckoutComponent。为此,我创建了共享服务。
export class CartService {
private cartSubjectList = new Subject<Products[]>();
currentSubjectList = this.cartSubjectList.asObservable();
public cartCount = 0;
constructor() {
console.log('CartService log:', this.currentSubjectList);
}
setData(cartList: Products[]) {
this.cartSubjectList.next(cartList);
}
getData() {
return this.currentSubjectList;
}
getCartProducts(): Products[] {
const products: Products[] = JSON.parse(localStorage.getItem('cart')) || [];
return products;
}
在CartComponent中,我在 setData 方法中将数据设置为我的 cartSubjectList。
export class CartComponent implements OnInit {
cartProducts: Products[];
constructor( private cartService: CartService) { }
ngOnInit() {
this.getCart();
}
getCart() {
this.cartProducts = this.cartService.getCartProducts();
this.cartService.setData(this.cartProducts);
}
}
在CheckoutComponent我想显示我的数组,但我的 checkoutProduct 未定义。
export class CheckoutComponent implements OnInit {
checkoutProducts: Products[];
constructor(private formBuilder: FormBuilder, private cartService: CartService) { }
ngOnInit() {
this.cartService.getData().subscribe( data => {
this.checkoutProducts = data;
console.log(this.checkoutProducts);
});
}
}
欢迎任何帮助或建议
解决方案
这是因为您使用的是Subject
. a 的新订阅者Subject
不会收到之前发出的任何内容,除非它是 aReplaySubject
或 a BehaviorSubject
。
我建议使用ReplaySubject
缓冲区长度为 1:
private cartSubjectList = new ReplaySubject<Products[]>(1);
当(通过CheckoutComponent
)进行新订阅时,它应该立即接收先前的发射。
推荐阅读
- python - Telethon:如何上传频道/聊天徽标?
- assembly - CMake:由程序集文件制成的共享库中的 SOVERSION 和 Mac 库 ID
- cassandra - Cassandra 模式验证
- go - 在 golang 中显示一周的第二天
- php - 会话的价值没有改变
- xml - XSLT:如何将身份转换的输出复制到 xslt 变量?
- ios - 在 UITableViewCell 内使用 UICollectionView 滚动滞后(闪烁)
- ios - 自定义单元格中的按钮操作未调用委托函数
- java - 为什么不需要捕获/处理这个抛出的异常?
- php - Codeigniter 通过单击更改图像,在第二次编辑时不起作用?