我应该使用什么样的rxjs集合类型来通知Angular中的add/remove?

我应该使用什么样的rxjs集合类型来通知Angular中的add/remove?,angular,rxjs,typescript-linq,Angular,Rxjs,Typescript Linq,我是rxjs的新手,我有以下几点 我订阅了一些rxjs Subject,但不知道如何从其可观察对象中仅删除特定项。因此,我使用了第二个变量removietem,也订阅了它,并从本地carItems变量中删除了元素。(它可以工作,但……是的,它闻起来很糟糕。一定有更好的做法) 删除一个对象后,我可以在订阅中重新设置整个集合,但我不希望这样,因为每个项目都有一个动画。还有另一个用于删除每个项目的动画 是否有类似于C#ObservableCollection的用法,它通知添加/删除操作并让我知道删除了

我是rxjs的新手,我有以下几点

我订阅了一些
rxjs Subject
,但不知道如何从其可观察对象中仅删除特定项。因此,我使用了第二个变量removietem,也订阅了它,并从本地carItems变量中删除了元素。(它可以工作,但……是的,它闻起来很糟糕。一定有更好的做法)

删除一个对象后,我可以在订阅中重新设置整个集合,但我不希望这样,因为每个项目都有一个动画。还有另一个用于删除每个项目的动画

是否有类似于C#ObservableCollection的用法,它通知添加/删除操作并让我知道删除了哪个特定对象

  import { TS } from 'typescript-linq'    
  @Injectable() 
  export class CartService {

  private items = new ReplaySubject<Array<ProductModel>>(1);
  private removeItem= new ReplaySubject<ProductModel>(1);
  var cartItems=new Array<ProductModel>();

  removeFromCart(remItem)
    {
      this.removeItem.next(remItem);
    }
 ...
有一个半相似的问题。我仍然无法在plnkr中运行以下QA接受的答案


有一种方法可以做你想做的事,但诚实地说,这不是最好的方法。如果需要全局状态,请改用全局主题。如果是本地状态,您可以只使用普通数组,或者通过将用户操作与数据相结合,如

假设userclick$和buttonClick$将修改数据

Observable.merge(userClick$,butonClick$).startWith([1,2,3])...
let items$=新接收行为主体([1,2,3])
让itemRemove=(索引)=>{
设arr=null
项目$.subscribe(值=>{
ar=value.filter((值,i)=>i!=索引)
})
项目$.next(ar)
}
删除项目(1)
物品$.subscribe(console.log)

请尝试以下代码:

@Injectable()
export class CartService{

  private items = new BehaviorSubject<Array<ProductModel>>(null);
  private cartItems=new Array<ProductModel>();

  removeFromCart(remItem)
  {
    this.carItems = this.carItems.filter((item:ProductModel) => item !== remItem);
    this.items.next(this.carItems);
  }

  getItems():BehaviorSubject<Array<ProductModel>>{
    return this.items;
  }


}


import {CartService} from 'yourServiceLocation';

@Component({
  selector: 'test-com',
  template: `<div>Test component</div>`
})

 export class TestComponent{

  private cartItems=new Array<ProductModel>();

  constructor(private cartService:CartService){
    this.cartService.getItems()
      .subscribe(items => this.carItems = items);
  }


  //On button clicked or so

  private removeItem(item:ProductModel){
    this.cartService.removeFromCart(item);
  }


}
@Injectable()
出口级货运服务{
私有项=新行为主体(空);
私有cartItems=新数组();
从购物车中移除(汇款)
{
this.carItems=this.carItems.filter((项目:ProductModel)=>item!==remieem);
this.items.next(this.carItems);
}
getItems():行为主体{
归还此物品;
}
}
从“yourServiceLocation”导入{CartService};
@组成部分({
选择器:“测试com”,
模板:`测试组件`
})
导出类TestComponent{
私有cartItems=新数组();
构造函数(专用cartService:cartService){
this.cartService.getItems()
.subscribe(items=>this.carItems=items);
}
//按一下按钮左右
private removeItem(项目:ProductModel){
此.cartService.removeFromCart(项目);
}
}

observatives是一个很好的工具,但并不是最适合所有东西。可以认为它们非常适合管理事件流,例如UI单击、按钮、滑块、http请求响应、服务器确认、超时等,您的UI可以处理这些信息流。它并不真正用于管理数据,尽管您可以使用可观察的调用操作例程来进行数据管理(如果您愿意)。如果您想管理应用程序中的状态,可能更适合。请您澄清为什么使用Replay主题而不是行为主题。我认为理解重播和行为主体做什么的问题并不特别。我所知道的唯一区别是行为主体需要一些初始值,但ReplaySubject不需要。就我而言,ReplaySubject是一个更好的选择。谢谢大家。我将尝试下面的项目,它也在内部使用rxjs,尽管它与我的解决方案类似,谢谢你的努力。谢谢你的兴趣,但我不想找这个。我可以订阅新产品集,并在下次运行时收到新产品集的通知。但是,没有对删除项目的订阅。顺便说一句,再次检查您的筛选:)。此问题要求提供类似于
C#ObservableCollection
的内容,它将
NotifyCollectionChangedEventArgs.OldItems属性
提供给其
CollectionChanges
事件订阅者。谢谢,我已更新了筛选:)。是的,你是对的,我认为没有类似于C#ObservableCollection的等效数据结构,但有很多解决方法。我已经利用了这些转变,但有几个原因可以避免。1) 不优雅2)降低可读性3)如果不能同步多个变量,可能会导致其他问题
@Injectable()
export class CartService{

  private items = new BehaviorSubject<Array<ProductModel>>(null);
  private cartItems=new Array<ProductModel>();

  removeFromCart(remItem)
  {
    this.carItems = this.carItems.filter((item:ProductModel) => item !== remItem);
    this.items.next(this.carItems);
  }

  getItems():BehaviorSubject<Array<ProductModel>>{
    return this.items;
  }


}


import {CartService} from 'yourServiceLocation';

@Component({
  selector: 'test-com',
  template: `<div>Test component</div>`
})

 export class TestComponent{

  private cartItems=new Array<ProductModel>();

  constructor(private cartService:CartService){
    this.cartService.getItems()
      .subscribe(items => this.carItems = items);
  }


  //On button clicked or so

  private removeItem(item:ProductModel){
    this.cartService.removeFromCart(item);
  }


}