我有一个cars
数组,其中包含属性:
cars: <Car[]> = [
{
color: 'red',
make: 'mazda',
year: 1960
},
{
color: 'blue',
make: 'mazda',
year: 1984
},
{
color: 'red',
make: 'honda',
year: 1999
}
]
正在修改可观察的updatesToCars
,并通过carsObservable
和.scan
将其分配给另一个可观察的.cache
。
let initialCars = cars;
carsObservable = updatesToCars.scan(
(cars: Car[], operation /* some crud operation that modifies the cars array */) => {
return operation(cars);
}, initialCars
).cache();
carsObservable
现在拥有最新的汽车列表。凉!我们现在要说的是,我想过滤所有具有特定品牌的汽车,同时牢记兼顾性:
carsOfACertainMake = new BehaviorSubject('mazda');
filteredCarsOfACertainMake = carsOfACertainMake.map((make) => {
return carsObservable.map((cars) => {
return _.filter(cars, function(car) {
return car.make === make;
});
});
}).switch().cache();
现在我们可以carsOfACertainMake.next('honda')
和filteredCarsOfACertainMake
可观察对象仅反映具有[{1}}品牌价值的汽车。
每次需要过滤不同的make时,我们必须清空honda
observable。
这有效,但似乎是一种实现此类功能的奇怪方式。 filteredCarsOfACertainMake
可观察到的可以实现吗?如果是这样,所需的代码是什么?
感谢。
答案 0 :(得分:1)
我认为您正在寻找combineLatest
或withLatestFrom
var carsOfACertainMake = new BehaviorSubject('mazda');
carsObservable.withLatestFrom(carsOfACertainMake, (cars, make) =>
_.filter(cars, car => car.make === make)
).cache();
filter
在这种情况下不会对你有很大的帮助,因为它无法真正处理变异标准的情况。相反,withLatestFrom
将避免从上方重新订阅费用,并且每次carsObservable
发出时都会使用最新的过滤器集发出。