使用来自一个ngrx存储减速器的Observable数据来过滤另一个的结果

时间:2016-10-10 21:23:40

标签: angular ngrx

我的ngrx商店包含两组数据:preferenceGroups,其中包含选定偏好值组和stocks

有很多preferenceGroups,有两种格式之一,一组布尔值或一个范围:

"preferenceGroups": [
    {
        "name": "Sectors",
        "type": "toggles",
        "preferences": [
            {
                "label": "Sector 1",
                "type": "boolean",
                "value": true
            },
            {
                "label": "Sector 2",
                "type": "boolean",
                "value": true
            }
        ]
    },
    {
        "name": "Exchange",
        "type": "toggles",
        "preferences": [
            {
                "label": "Exchange 1",
                "type": "boolean",
                "value": true
            },
            {
                "label": "Exchange 2",
                "type": "boolean",
                "value": true
            }
        ]
    },
    {
        "name": "Price",
        "type": "price-range",
        "preferences": {
            "label": "Price",
            "type": "currency",
            "value": {
                "minimum": 0,
                "maximum": 999
            }
        }
    },
    ...
]

我也有一堆股票,都有相同的字段,通常看起来像这样:

"stocks": [
    {
        "state": {
            "accepted": false,
            "rejected": false
        },
        "change": -5.36,
        "changePercent": -0.13,
        "dividend": 12.05,
        "equitySummaryScore": 8,
        "exchange": "Exchange 1",
        "price": 97.10,
        "sector": "Sector 1",
        ...
    },
    ...
]

我的过滤器的工作方式是针对每个preferenceGroup,我想考虑任何具有与任何布尔过滤器设置为true的值相匹配的库存,并且在范围的情况下,考虑任何在该范围内的值

我可以使用

从我的ngrx商店获取所有股票和preferenceGroups作为Observables
this.stocks = this._store.select('stocks');
this.preferenceGroups = this._store.select('preferenceGroups');

我需要做的是将过滤后的股票存储为Observable,方法是使用this.preferenceGroups中的数据来过滤this.stocks

this.filteredStocks = [something I can't figure out]

例如,我列出的单一股票是匹配的,因为它有"exchange": "Exchange 1""sector": "Sector 1""price": "97.10"

1 个答案:

答案 0 :(得分:3)

如果您有两个可观察量,一个带有股票,另一个带有过滤器,则需要组合两个流。您需要的是一系列每种股票以及您的偏好,以了解您是否可以展示它们。 请检查以下代码:

    data.map { x =>
      useState(someSetupState, x)
    }
    .onComplete { () =>
      someSetupState.shutdown()
    }

使用combineLatest时,可以组合两个observable。传递给combineLatest方法的函数将从库存$ observable中获得最新值,并从首选项$ observable中获取最后一个值。这些可观察物来自你的商店。

在这个函数中,你可以像在命令式样式中那样实现过滤逻辑。

每次向商店添加新库存时,ngrx都会将新值推送到库存可观察量,并且将重新评估带有逻辑的函数。新的偏好也是如此。

如果您在模板中订阅了合并的$ stream,则每个库存添加或首选项添加都会生成更新的视图。

相关问题