【问题标题】:Angular NgRX: going to the DB if the store slice is emptyAngular NgRX:如果存储切片为空,则转到数据库
【发布时间】:2020-11-03 15:48:41
【问题描述】:

我正在使用 Angular NgRX。我还在学习 NgRX。在下面的代码中。我正在使用选择器从商店中获取状态切片。如果数据未定义或长度等于 0,则调用 dispatch,然后转到 DB 获取数据。

我的问题是:这是正确的方法吗?或者如果存储切片未定义,NgRX Effects 是否应该处理访问 API 的逻辑?

在下面的代码中,如果我不订阅选择器并检查它,那么它每次都会调用 API 端点,这违背了使用状态存储的目的,是吗?

import { Component, OnInit, OnDestroy } from '@angular/core';
import { select, Store } from '@ngrx/store';
import { Observable, Subscription } from 'rxjs';
import { tap } from 'rxjs/operators';
...

@Component({
  selector: 'my-pro',
  templateUrl: './my-pro.component.html',
  styleUrls: ['./my-pro.component.scss'],
})

export class MyProxyComponent implements OnInit, OnDestroy {

  myProxyList$ = this.store.select(getProxyList);
  subs: Subscription;
  searchCriteria = {
    standardId: 'mka',
    start: 1,
    end: 25,
  };

  constructor(
    private store: Store<State>,
  ) {
  }

  ngOnInit(): void {
    this.getMyProxy();
  }
 
  ngOnDestroy(): void {
    this.subs.unsubscribe();
  }

  getMyProxy(): void {
    this.subs = this.myProxyList$.subscribe(
      data => {
        console.log('myProxyList', data);
        // if length is 0, goto the db
        if (data === undefined || data.length === 0) {
           // ngrx action to call api
           this.store.dispatch(ProxyActions.getAllProxyList({ searchCriteria: this.searchCriteria }));
         }
       }
     );
  }

}

【问题讨论】:

    标签: angular ngrx


    【解决方案1】:

    您肯定想在您的效果器中执行此操作。这是很多样板。如果看起来太多,请查看 @ngrx/component-store 或 rxjs 外观。它们具有较少的间接性,并且在您的用例中,尤其是对于一个组件,它们可能更适合。例如,请参阅此处的搜索票示例:https://medium.com/angular-in-depth/angular-you-may-not-need-ngrx-e80546cc56ee

    对于 ngrx 解决方案,请在您的商店中添加一个 proxyListLoaded 布尔值以跟踪它是否已加载。

    
     proxyList$ = createEffect(() =>
        this.actions$.pipe(
          ofType(proxyActions.getAllProxyList),
          withLatestFrom(
            this.store.select(getProxyListLoaded),
          ),
          filter(([_action, loaded]) => !loaded),
          exhaustMap(() => 
            this.proxyService.getProxyList().pipe(
            map(result => new LoadOrders(result))
          ))
      );
    

    【讨论】:

    • 这看起来不错,你能解释一下代码吗?当从 db 加载数据时,布尔 proxyListLoaded 设置为 true 的位置在哪里?
    • 也许您可以提供一个 stackBlitz 或文章链接。基本上从商店获取,如果没有从数据库获取。
    猜你喜欢
    • 2019-05-01
    • 2018-03-26
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多