搜索/过滤状态 NGXS

2024-01-31

我是 NGXS 的新手,并尝试将其集成到一个小项目中。唯一的问题是没有关于状态搜索/过滤的好例子。

我的应用程序从后端 API 获取产品列表。它在页面上按 SKU 显示它们。我希望用户能够在输入字段中输入 SKU,并让列表在用户输入时自动筛选产品。

产品.状态.ts:

@Selector()
static getProductList(state: ProductStateModel) {
  return state.products;
}

@Selector()
static prodFilter(searchObj: any[]) {
  // something needs to happen here in order to filter state
}

产品.组件.ts:

@Select(ProductState.getProductList) products: Observable<Product[]>;

filterForm = this.fb.group({ sku: null });

constructor( private store: Store, private fb: FormBuilder ) { }

ngOnInit() {
  this.store.dispatch( new GetProducts() );
}

//something in here (ngOnInit? ngOnChanges?) to pass (cloned??) product state into selector??

产品.component.html:

<form
  [formGroup]='filterForm'
  novalidate
  ngxsForm='products.filterForm'
  (ngSubmit)='onSubmit()'
>
  <input type='number' formControlName='sku' />
  <button type='submit'>Submit</button>
</form>

<mat-accordion class='product-accordion'>
  <mat-expansion-panel *ngFor='let product of products | async'>
    <mat-expansion-panel-header>
      SKU: {{ product.sku }}
    </mat-expansion-panel-header>

    <p>${{ product.price }}</p>
    <p>{{ product.description }}</p>
  </mat-expansion-panel>
</mat-accordion>

我有很多问题。我相信我不应该直接改变产品状态,所以我会克隆它吗? HTML 输出会改变吗?我应该为过滤后的产品创建一个新的 state.ts 文件吗?

任何帮助将不胜感激(尤其是 stackblitz 示例)!


如果您像这样对状态进行建模,捕获基本产品列表和在搜索文本框中输入的文本,您可能会发现这更容易:

export interface ProductsStateModel {
  products: Product[];
  filterText: string; // Your SKU value that is entered
} 

..然后在您的状态下,使用选择器投影出您实际想要在 UI 上显示的筛选列表(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 });
   }
..

}

在 UI 中,您可以在模板中订阅选择器,即products.component.ts use @Select(ProductsState.filteredProducts) products$.

当搜索文本更改时,您可以向商店分派一个操作以更新状态中的该字符串,即store.dispatch(new ProductSkuEntered({ skuText: enteredText }));然后,NGXS 选择器将自动更新您的“filteredProducts”列表,以仅显示与文本匹配的产品。

连接一个也很好debounceTime更改文本,以便仅在用户停止输入时进行过滤。即仅发送ProductSkuEntered去抖后。

注意:我看到您正在使用 NGXS 表单插件 - 我没有使用该插件的经验,但这种情况不需要它(尽管您可能在其他地方使用它)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

搜索/过滤状态 NGXS 的相关文章

随机推荐

  • 如何将 spring-boot WAR 部署到 Tomcat?

    在发布之前我已经花了很多时间在这上面 我有一个 spring boot 应用程序 可以作为 JAR 运行良好 但是当我尝试将其转换为 WAR 时 我无法部署它 我尝试寻找它的规则来决定Tomcat是嵌入式的还是外部的 WEB INF lib
  • 如何在QTextEdit中显示数学方程?

    有谁知道如何仅使用 Python 在以任何格式 TXT MathML MML LaTeX HTML XML 或任何格式 编写的 QTextEdit 中显示数学方程 即不使用像 Latex 本身这样的第 3 方包 我试图从 Qt 中找到 Ma
  • 为什么在一项测试中向量比地图更快,而在另一项测试中却不然?

    我一直被告知矢量速度很快 而在我多年的编程经验中 我从未见过任何东西可以缩短这一点 我决定 过早地优化并 编写一个关联类 它是一个围绕顺序容器的薄包装器 即 std vector并提供了相同的接口 std map 大部分代码都非常简单 我很
  • 在 Firebase 中执行多位置更新时如何使用事务?

    在我的 Firebase 数据库中 我需要同时对两个位置进行两次写入 我对这两个位置都有规则 以确保用户在不同时写入另一个位置的情况下无法在那里写入 对这些位置之一的写入需要递增 递减 当然 这必须通过事务来完成 否则我无法保证用户不会覆盖
  • 单击后禁用单选按钮

    我需要一些帮助 这是html div p match1 p teamA div
  • 抑制警告“类别正在实现一个方法,该方法也将由其主类实现”

    我想知道如何抑制警告 类别正在实现一种方法 该方法也将由 它的初级班 我有一个特定的代码类别 UIFont systemFontOfSize CGFloat fontSize return self aCustomFontOfSize fo
  • 从 C# 访问经过 SPNEGO 身份验证的 Web 服务

    我们有一个 Web 服务 通过 HTTP 提供数据并通过 SPNEGO 和单点登录 对用户进行身份验证 我们想为此 Web 服务编写一个 C 客户端 NET 中是否有任何标准 提供的方法来生成必要的令牌 广泛的谷歌搜索表明 SPNEGO 没
  • BUG:无法在 DatePicker 上选择浮动 VSTO 外接程序之外的日期

    我在这里记录了 Microsoft 的问题 Repro 可供下载 https connect microsoft com VisualStudio feedback details 741454 value change event doe
  • Laravel 5 记得我不工作

    我无法得到Laravel 记住账号功能来工作 我将记住令牌列添加到我的User型号表 我的User Model Authenticatable 用户模型不包含与 记住我 功能相关的任何其他特定内容 我正在使用默认的身份验证驱动程序和防护 M
  • Log4J2 属性替换 - 默认

    我只是想知道是否有任何方法可以为 LOG4J 中的属性替换提供默认值 我想在 java 系统属性中传递文件路径 然后将其与 env mySystemProperty 一起使用 但是如果开发者忘记设置这个属性怎么办 然后我想在 log4j2
  • 2.0.1 版本的速度滚动问题

    最新版本 Velocity 2 0 1 的更新会导致与滚动相关的问题 具体来说 会抛出以下错误消息 错误 速度 第一个参数 滚动 不是属性映射 已知操作或注册的重定向 正在流产 以下示例适用于 Velocity 1 5 https code
  • LOCK_NB在flock中是什么意思?

    什么是LOCK NBPHP 中的意思是flock命令 LOCK NB意味着非阻塞 通常当您尝试锁定文件时 您的 PHP 脚本执行将会停止 致电给flock then blocks它从恢复 它会一直这样做 直到删除所访问文件上的并发锁为止 大
  • 如何让 selenium-webdriver 忽略 Firefox 和 PhantomJS 中的 SSL 错误?

    考虑到这些节点依赖关系 chromedriver 2 24 1 cucumber 1 3 0 geckodriver 1 1 2 phantomjs prebuilt 2 1 12 selenium webdriver 3 0 0 beta
  • Eclipse 升级不工作

    我的 Eclipse 突然停止构建 Android 因此我删除了旧版本并安装了 Indigo 当我尝试导入 Android 项目时 出现以下错误 Errors occurred during the build Errors running
  • 为什么以 margin 0 auto 居中可以与 display:block 一起使用,但不能与 display:inline-block 一起使用?

    只是一个困扰我的问题 为什么以 margin 0 auto 确实可以很好地工作 display block 但当显示设置为时 div 不会居中 display inline block 感谢您的解答 我的理解如下 尽管我很高兴被纠正 内联元
  • C++ Windows 中的 RAW 套接字

    我想用一个RAW Socket在 Visual C 中 我看到了一个函数Linux这是 int out socket AF INET SOCK RAW htons ETH P ALL 使用此代码linux我们可以做到这一点 但是如何在 Wi
  • C 中结构体和数组哪个更快?

    我想实现 抽象地表示 一个二维 4x4 矩阵 我为矩阵乘法等编写的所有代码都将完全 展开 也就是说 我不会使用循环来访问和写入矩阵中的数据条目 我的问题是 在 C 中 使用这样的结构会更快吗 typedef struct double e0
  • 如何正确处理 LinqToSql 类的 System.Nullable 字段?

    我有一个带有一些可为空双字段的表 使用 LinqToSQL 尝试直接使用该字段我得到 参数类型 System Nullable 不可分配给参数类型 double 我该如何正确处理这个问题 该问题与 Linq 无关 这与之间的转换有关doub
  • React Native ScrollView/FlatList 不滚动

    我有一个数据列表 我想将其放入 FlatList 即 ScrollView 中 每当我尝试向下滚动以查看列表的更多内容时 ScrollView 就会弹回到列表顶部 因此我永远看不到列表底部 我正在使用 Expo 奇怪的是 如果我只是创建一个
  • 搜索/过滤状态 NGXS

    我是 NGXS 的新手 并尝试将其集成到一个小项目中 唯一的问题是没有关于状态搜索 过滤的好例子 我的应用程序从后端 API 获取产品列表 它在页面上按 SKU 显示它们 我希望用户能够在输入字段中输入 SKU 并让列表在用户输入时自动筛选