angular - 双向组合选择器,没有循环依赖
问题描述
我想结合两个选择器来获取产品和获取类别。
这些类别引用了他们的产品。
//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)
}
);
有什么解决方案可以防止这种情况发生?现在我正在使用另一个更抽象的文件来组合来自不同状态的选择器。这似乎不是一个可扩展的解决方案。有点乱。
解决方案
您需要重组代码。我创建了另一层依赖于外部选择器的选择器。merge-one.selector.ts 从 base-one.selector 和 base-two.selector 导入只需确保基本选择器不依赖于其他选择器
推荐阅读
- c# - .NET Core 3.0:警告 CS8632 可空引用类型的注释只能在“#nullable”注释上下文中的代码中使用
- python - Pycharm 控制台错误 - 找不到源文件
- c# - 需要帮助以使 crc 计算的类线程安全
- python - 如何测试期望文件的点击命令
- redirect - Flutter:如何获得有关 url 重定向的通知并防止使用 WebView 对象进行重定向:
- python - 为什么我的图是分开显示的,而不是在同一张图上?
- java - 关于Processor接口的process(...)方法中定义的参数
- pandas - 枢轴非常大的表熊猫的替代品
- c# - 在 Jint 中序列化“JsValue”
- python-2.7 - Cythonizing sklearn/_isotonic.pyx 失败