给出项目清单
items = [
{id: 1, selected: false},
{id: 2, selected: false}
]
如何构造一个可观察的选择器,该选择器返回当前具有selected = true的项目,如果没有选择项目则返回null?
首次尝试:
items
.flatMap(item => item)
.filter(item => item.selected)
.startWith(null)
在初始加载和选择项目时正常工作。但是一旦所有项目再次被取消选择,它就不会发出null - 这是有道理的,因为filter()运算符没有通过。我在这里缺少的是能够设置' null'作为在这种情况下会发出的后备默认值。
第二次尝试,使用带默认值的first()' null':
items
.flatMap(item => item)
.first(item => item.selected, null)
这在初始加载时也能正常工作,但它不会在任何后续更改事件上执行。据我所知,这是因为first()在初始运行完成后完成了流。
最终(工作)尝试:
items
.map((items) => {
selectedItems = items.filter(item => item.selected);
return selectedItems.length ? selectedItems : [null]
})
.flatMap(item => item)
这就是我需要的,但是我想知道是否还有其他方法只使用rxjs运算符来表达这种逻辑?
答案 0 :(得分:0)
您正在寻找可以发出当前状态(或切换)的scan
运算符。看到这个jsfiddle几乎可以做你想要的东西(根据状态和返回当前状态过滤项目)https://jsfiddle.net/crunchie84/n1x06016/6/