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