【问题标题】:Angular 8: Get values without subscription to an observableAngular 8:在不订阅 observable 的情况下获取值
【发布时间】:2020-04-19 09:44:00
【问题描述】:

这是我需要在应用程序的各个部分订阅的两种方法:

  getProducts(): Observable<Product[]> {
    return this.http.get<Product[]>(this.url);
}

  getProductsByIds(ids: number[]): Observable<Products[]> {
    return this.getProducts()
      .map(products => products.filter(products => ids.includes(product.id)));
}

这适用于我的大多数组件,但在一个组件中,我事先知道id-s,只想显示 id-s 为 1、2、9、18 的 4 个产品。我想调用像这样的方法:getProductsByIds([1, 2, 9, 18]))。我只知道如何订阅这两个 observables,但是我怎样才能一劳永逸地获得这 4 个产品(不需要值流)?我一定错过了一些基本的讲座..

【问题讨论】:

  • 这些值是静态数据吗?
  • 是的,产品一直都是一样的,id-s一样,我只是在应用中过滤它们。
  • dose stackoverflow.com/questions/42753212/… 是您问题的答案
  • 谢谢大家的回答! Plochie,谢谢你,这很有意义。现在我正在组件中进行所有订阅(而不是在服务中),所以我希望重构所有内容不会太多。由于我有很多其他过滤方法(例如,基于不同类型的产品/搜索/收藏/等),我必须考虑一下我如何能够重新处理它。

标签: angular components observable


【解决方案1】:

您可以在service构造函数中调用该函数,并在获得结果后将该结果设置为class级别变量staticProducts: Products[]

当你想使用staticProducts时,注入服务并直接由this.demoService.staticProducts使用

服务

@Injectable()
export class DemoService {

  staticProducts: Products[];

  constructor(.....) {
    // get static data on startup
    this.getProductsByIds([1, 2, 9, 18]);
  }

  getProductsByIds(ids: number[]): Observable<Products[]> {
    return this.getProducts()
      .map(products => products.filter(products => ids.includes(product.id)))
      .subscribe(res => {
        this.staticProducts = res;
      });
  }

  ...
}

【讨论】:

    【解决方案2】:

    如果您只想获取一些值并将它们粘贴到没有 Observable 的变量中。 从您的组件中,您可以像这样调用 getProductByIds:

    service.getProductByIds([1,2,9.8]).take(1).subscribe(x => {
       this.variableWithProducts = x;
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 2021-04-02
      • 2020-10-17
      • 2020-11-24
      • 2020-03-18
      • 2018-10-13
      相关资源
      最近更新 更多