Возможно, вам будет проще, если вы смоделируете свое состояние таким образом, захватив список основных продуктов и текст, введенный в текстовое поле поиска:
export interface ProductsStateModel {
products: Product[];
filterText: string; // Your SKU value that is entered
}
.. Затем в вашем штате используйте селектор для проецирования отфильтрованного списка, который вы действительно хотите отобразить в пользовательском интерфейсе (filteredProducts
).
@State<ProductsStateModel>({
name: 'products'
})
export class ProductsState {
@Selector()
static filteredProducts(state: ProductsStateModel) {
return state.products.filter(p => p.sku === state.filterText);
}
@Action(ProductSkuEntered)
updateFilter({patchState}: StateContext<ProductStateModel>, {payload}: ProductSkuEntered) {
patchState({ filterText: payload.skuText });
}
..
}
В пользовательском интерфейсе вы можете в своем шаблоне подписаться на селектор, то есть в products.component.ts
использовать @Select(ProductsState.filteredProducts) products$
.
Когда текст поиска изменяется, вы можете отправить действие в хранилище, чтобы обновить эту строку в состоянии, т.е. store.dispatch(new ProductSkuEntered({ skuText: enteredText }));
Затем селектор NGXS автоматически обновит ваш список «FilterProducts», чтобы отобразить только те из них, которые соответствуют тексту.
Также приятно подключить debounceTime
к изменению текста, чтобы вы фильтровали только тогда, когда пользователь прекратил печатать. то есть отправка ProductSkuEntered
только после дебалюра.
Примечание: я вижу, что вы используете плагин форм NGXS - у меня нет опыта работы с этим плагином, но он не требуется для этого сценария (хотя вы можете использовать его в другом месте).