双向组合选择器,无需循环依赖



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

这些类别都有其产品的参考。

//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)
}
);

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

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

最新更新