如何在使用 observable 更新数组时更新 *ngFor 以及如何在网站加载时初始化 observable?

Posted

技术标签:

【中文标题】如何在使用 observable 更新数组时更新 *ngFor 以及如何在网站加载时初始化 observable?【英文标题】:How update *ngFor on updating array using observable and how to initialize observable on website load? 【发布时间】:2020-01-26 09:38:48 【问题描述】:

我有两个组件“购物车”和“家”。这里的“主页”组件显示产品列表,它是网站的第一页。当有人使用“购物车”按钮将产品添加到购物车时,我想更新购物车。为此,我创建了一个使用 observable 将消息从“home”发送到“cart”组件的服务。

我面临的问题: 1. 使用 observable 更新数组时 *ngFor 没有更新。 2. 当我在 ngOnInit() 上初始化 observable 时,购物车数组只有在我至少访问购物车组件一次时才会更新。

home.component.ts

sendToCart(id:string) 
this.addtocart.sendId(id);

cart.service.ts

private productIdSource = new Subject<string>();
productId$ = this.productIdSource.asObservable(); 

constructor()  

sendId(id:string) 
this.productIdSource.next(id);

cart.component.ts

itemList:any = ["hello"];

constructor(private addtocart: CartService) 

ngOnInit() 
  this.addtocart.productId$.subscribe(
    msg => 
      console.log(msg);
      this.itemList.push(msg);
      console.log(this.itemList);
    
  )

cart.component.html

<ul>
<li *ngFor="let item of itemList">
    item
</li>
</ul>

我尝试了“ChangeDetectorRef”、markForCheck() 和 detectChanges(),但都没有奏效。

【问题讨论】:

可以分享到stackbiltz吗 【参考方案1】:

使用BehaviorSubject

private productIdSource = new BehaviorSubject<string>();
productId$ = this.productIdSource.asObservable(); 

constructor()  

sendId(id:string) 
   this.productIdSource.next(id);

【讨论】:

BehaviorSubject 有点用,但它只适用于添加一项。 您一次将一件商品添加到购物车对吧? 从产品列表中,用户可以点击“+购物车”按钮添加多个项目,但数量是一个。 好的..你能分享到stackbiltz吗【参考方案2】:

尝试覆盖itemList 而不是变异:

this.addtocart.productId$.subscribe(
    msg => 
      this.itemList = [...this.itemList, msg]; // instead of this.itemList.push(msg);
    
  )

【讨论】:

Array 照常更新,但 *ngFor 没有更新。这也是我至少访问一次购物车组件的时候。

以上是关于如何在使用 observable 更新数组时更新 *ngFor 以及如何在网站加载时初始化 observable?的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift Observeable 不会在数据更改时更新 tableview

更新可观察打字稿中的数组值

在使用 redux-observables 开始另一个史诗之前,如何等待不同的史诗完成并更新商店?

如何从 CLLocationManager 更新创建 Observable

如何从 BehaviorRelay observable 更新 tableView?

Knockoutjs官网翻译系列 Observable 数组