SAP 电商云 Product-loading.service.ts 的实现

Spartacus 从后端请求商品数据时,返回的payload往往非常大,可能在多个地方都需要用到,比如商品轮播、商品详情页等。 但是,并非所有这些地方都需要完整的有效负载。 通过将有效负载分解成我们称为范围的片段,您可以指定每个特定情况实际需要有效负载的哪一部分。

Spartacus 当前支持加载产品数据的范围。

我们建议使用 product search API 时,总是显式指定 scope:

productService.get(code, ProductScope.LIST) // 检索最少的产品数据,适用于listing、轮播商品等。
productService.get(code, ProductScope.DETAILS) // 获取详细的商品数据,适合在商品详情页使用或者生成json-ld schema

当您使用 Spartacus OccProductAdapter 时,您可以使用端点配置中的 fields 参数在 backend.occ.endpoints.product 键下配置范围有效负载。 下面是一个例子:

Spartacus 默认支持的 scope:

export enum ProductScope {
    
    
  LIST = 'list',
  DETAILS = 'details',
  ATTRIBUTES = 'attributes',
  VARIANTS = 'variants',
}

每一种 scope 默认的 API endpoint:

我们也可以自定义 scope. 您可以通过添加具有指定字段参数的新端点配置来定义自定义产品范围。 在以下示例中,定义并提供了一个新的价格范围:

{
    
    
  backend: {
    
    
    occ: {
    
    
      endpoints: {
    
    
        product: {
    
    
          price: 'products/${productCode}?fields=price(FULL)',
        },
      },
    },
  },
}

如何消费上面代码里定义的 price scope:

productService.get(code, 'price');

在某些情况下,同时获取多个范围的数据是有益的。

在这个例子中,你应该期望多个 emission,在某些情况下,最初可能包含部分有效负载,因为 observable 会立即为所有加载的范围提供数据,并延迟加载丢失的范围。

根据提供范围的顺序,将每个范围的部分有效负载合并为一个有效负载。 如果作用域有效负载重叠,则稍后在数组中指定的作用域可以覆盖之前提供的部分有效负载。 提供相互不重叠的范围定义总是更可取的,但只要您知道合并顺序,提供重叠的范围定义当然是可以接受的。

您可以通过将范围数组传递给 productService.get 方法来做到这一点。 下面是一个例子:

productService.get(code, [ProductScope.DETAILS, ProductScope.ATTRIBUTES]) // returns a product payload with merged data for both scopes

进入 home page 时,product carousel 控件,会逐一调用 product service 根据 product code 读取数据:

scope 硬编码为 LIST, 意思是读取 list scope 的数据。
scope 的数据,来自后台配置:

包含的是 product 数据的 Observable wrapper,而非数据本身。

猜你喜欢

转载自blog.csdn.net/i042416/article/details/123204500