首页 > 解决方案 > 双向组合选择器,没有循环依赖

问题描述

我想结合两个选择器来获取产品和获取类别。

这些类别引用了他们的产品。

//category.selectors.ts
import {ProductSelector} from "./product.selector.ts"

export const selectCategoryEntitiesDeep = createSelector(
        CategorySelectors.selectCategoryEntities,
        ProductSelectors.selectProductEntitiesDeep,
        (categoryEntities, productEntities): Dictionary<Category> => {
            const _categoryEntities = ObjUtils.cloneDeep(categoryEntities);
            Object.keys(_categoryEntities).forEach(id => {
                _categoryEntities[id]["products"] = _categoryEntities[id].productsIds.map(productId => {
                    return productEntities[productId];
                });
            });

            return _categoryEntities;
        }
    );

这是直截了当的。在为产品编写选择器时,我想添加对产品所属所有类别的引用。为了能够做到这一点,我需要将 category.selctor.ts 导入 product.selector.ts。当我也将产品导入类别时,这将导致循环依赖。

// product.selectors.ts
import {CategorySelectors} from "./category.selectors.ts"

export const selectProductEntitiesDeep = createSelectorFactory<{}, Dictionary<Product>>(StateUtils.customObjectMemoizer)(
        ProductSelectors.selectEntities,
        CategorySelectors.selectCategoryEntities,
        (productEntities: Dictionary<Product>,
         categoryEntities: Dictionary<Category>
        ) => {
            return createProductDictionary(productEntities, categoryEntities)
        }
    );

有什么解决方案可以防止这种情况发生?现在我正在使用另一个更抽象的文件来组合来自不同状态的选择器。这似乎不是一个可扩展的解决方案。有点乱。

标签: angulararchitecturengrxcircular-dependency

解决方案


您需要重组代码。我创建了另一层依赖于外部选择器的选择器。merge-one.selector.ts 从 base-one.selector 和 base-two.selector 导入只需确保基本选择器不依赖于其他选择器


推荐阅读