Angular Signal Store中能否基于特性参数启用/关闭Store特性的技术问询
Angular Signal Store中能否基于特性参数启用/关闭Store特性的技术问询
当然可以呀!你完全能通过特性参数来控制Angular Signal Store里的特性是否启用,甚至还能根据参数调整特性的具体行为。咱们结合你给出的代码示例来详细说下怎么实现:
首先,先看你定义的BooksStore,目前是传入true来启用选中实体特性:
import { signalStore } from '@ngrx/signals'; import { withEntities } from '@ngrx/signals/entities'; import { withSelectedEntity } from './selected-entity.feature'; import { Book } from './book.model'; export const BooksStore = signalStore( withEntities<Book>(), withSelectedEntity(true) // 这里的参数用来控制特性 );
接下来咱们完善withSelectedEntity这个特性函数,让它能根据传入的参数决定是否启用整个特性,或者调整特性的功能:
import { computed } from '@angular/core'; import { signalStoreFeature, withComputed, withState, withMethods } from '@ngrx/signals'; import { EntityId, EntityState } from '@ngrx/signals/entities'; export type SelectedEntityState = { selectedEntityId: EntityId | null }; export function withSelectedEntity<Entity>( enableFeature: boolean // 控制特性是否启用的参数 ) { // 如果参数为false,直接返回空特性,相当于不添加任何相关功能 if (!enableFeature) { return signalStoreFeature(); } // 参数为true时,返回完整的选中实体特性逻辑 return signalStoreFeature( withState<SelectedEntityState>({ selectedEntityId: null }), withComputed(({ entityMap, selectedEntityId }) => ({ selectedEntity: computed(() => { const id = selectedEntityId(); return id ? entityMap()[id] : null; }), })), withMethods((store) => ({ setSelectedEntityId: (id: EntityId | null) => { store.selectedEntityId.set(id); // 如果有其他逻辑,比如你提到的保存到数据库,也可以在这里根据参数扩展 } })) ); }
这样一来,你就可以通过传入不同的参数来灵活控制特性了:
- 启用特性:
withSelectedEntity(true),此时Store会拥有选中实体的状态、计算属性和方法 - 关闭特性:
withSelectedEntity(false),这个特性不会向Store添加任何额外的状态或逻辑
如果你的需求更复杂——比如不是完全关闭特性,而是根据参数调整部分行为(比如你提到的saveInDbFeature,控制是否把选中ID保存到数据库),也可以在特性函数里做条件判断:
export function withSelectedEntity<Entity>( saveInDbFeature: boolean ) { const baseFeatures = [ withState<SelectedEntityState>({ selectedEntityId: null }), withComputed(({ entityMap, selectedEntityId }) => ({ selectedEntity: computed(() => { const id = selectedEntityId(); return id ? entityMap()[id] : null; }), })) ]; // 根据参数决定是否添加保存到数据库的逻辑 if (saveInDbFeature) { baseFeatures.push( withMethods((store) => ({ setSelectedEntityId: (id: EntityId | null) => { store.selectedEntityId.set(id); // 这里添加保存到数据库的逻辑 // saveSelectedIdToDb(id); } })) ); } else { baseFeatures.push( withMethods((store) => ({ setSelectedEntityId: (id: EntityId | null) => { store.selectedEntityId.set(id); } })) ); } return signalStoreFeature(...baseFeatures); }
这种方式既保留了特性的复用性,又能根据参数灵活调整功能,完全符合你的需求~
备注:内容来源于stack exchange,提问作者Karmidzhanov
相关产品推荐
相关产品推荐

