---
title: "CXAオブサーブルサービス"
slug: "the-cxaobservable-service"
abstract: "CXAObservableサービスの概要およびサポートする手法。"
---
# CXAオブサーブルサービス

CXAObservableサービスは、[レンダリングが通信し](https://doc.sitecore.com/xp/ja/developers/101/sitecore-experience-commerce/rendering-communication.html "Rendering communication") つつも緩やかに結合され、独立し、他のレンダリングに気づかないために必要なサポートを提供します。基本的な概念はObserver設計パターンに似ていますが、状態を変えるObservableオブジェクトではなく、Observableを通じてイベントをトリガーできる個別のレンダリングであり、他のレンダリングがそれを受信しています。レンダリングはイベントをサブスクライブし、そのイベントが別のレンダリングによって送信されると、加入者はCXAObservableを通じてそのイベントを通知されます。

内部的には、CXAObservableサービスはCustomObservableの実装を使って観測可能なインスタンスを用いて購読・送信します。より複雑なシナリオをサポートするために、この実装をRxJs Subjectなど他の実装に置き換えることができます。

レンダリング間の通信はレンダリング初期化時に管理されます。例えば、すべてのレンダリングが初期化される前にイベントが発生した場合(CXAApplication.IsInitialized = false)、初期化中にイベントが発生した場合、すべてのレンダリングが初期化されるまでそのイベントはキューに保持されます。キュー内のイベントは順番に発生します。これにより、他のレンダリングでイベントが発生した後にイベントにサブスクライブするレンダリングなど、サブスクライバーによる見逃しのイベントを防ぐのに役立ちます。

![Sequence diagram illustrating the calls that occur](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/101/sitecore-experience-commerce/images/Visio_CXAObservable.png)

CXAObservableサービスは以下の手法を実行します。 [CXACartContext](https://doc.sitecore.com/xp/ja/developers/101/sitecore-experience-commerce/the-cxacartcontext-service.html "The CXACartContext service")とやり取りし、さまざまな [共有イベント](https://doc.sitecore.com/xp/ja/developers/101/sitecore-experience-commerce/sxa-storefront-shared-events.html "SXA Storefront shared events")を利用します。

-   方法:説明
-   イベントのサブスクライブ:レンダリングはメソッドを実行するためにイベントにサブスクライブします。使用されるメッセージパラメータは、 emitEvent 関数が呼び出された際に何が渡されるかに依存します。リスナーはイベント引数で呼び出されます。イベントに対して出力されるオブジェクトの種類に基づいて引数を処理します。このメソッドはサブスクライバーを返します。
-   イベントをエミットする:レンダリングはイベントをエミットします。これは文字列や任意の種類のオブジェクトで構いません。ベストプラクティスは、すべてのリスナーが処理できる一貫した型を持つことです。
-   製品にサブスクライブ:レンダリングは特定の製品IDに関連するすべてのイベントをサブスクライブし、メソッドを実行します。リスナーは2つの引数で呼び出されます:イベント名イベントargumentサブスクライバーを返します。
-   製品イベントのサブスクライブ:レンダリングは特定のプロダクトIDに関連付けられたイベントにサブスクライブしてメソッドを実行します。リスナーはイベント引数で呼び出されます。
-   イベントの購読解除:イベントの配信解除。

SXA Storefrontは以下の共有イベントを使用しています。

-   イベント:説明
-   CXAEvent.ClearMessage表示されたメッセージを削除するためにメッセージ概要レンダリングを要求します。
-   CXAEvent.SendMessage: メッセージ要約レンダリングにメッセージを表示するよう要求します。イベント引数:CXAMessageType enum:InfoErrorWarning

{
  type:
CXAMessageType,
  message: String
}

-   CXAEvent.CartUpdated: は最新のカートが受信されたときにイベントを発します。このイベントは、コンテキストで受信されたオブジェクトがCartJsonResult型の場合、CXACartContextによって発行されます。
-   CXAEvent.SetPrice: は、現在の製品バリアントまたは製品バンドル選択の価格を表示するようProduct Priceレンダリングに要求します。イベントの引数:

{
  productId: String,
  listPrice: Number,
  adjustedPrice:
Number,
  isOnSale: Boolean,
  savingsMessage:
String
}

-   CXAEvent.SelectedProduct: は製品バリアントを選択するとイベントを発します。

Event argument:
{
  CurrentCatalogName:
String,
  CurrentProductId:
String,
  CurrentVariantId:
String
}

-   CXAEvent.SelectedBundleProduct: はプロダクトバンドルを選択するとイベントを発します。イベントの引数:

{
  bundleSelection:
BundleSelection
}

-   CXAEvent.SelectedProductValid: は現在の製品選択が有効であることを示すイベントを発し、Add to CartレンダリングでAdd to Cartボタンを有効にすることができます。
-   CXAEvent.SelectedProductInvalid: は現在の製品選択が有効であることを示すイベントを発し、カートに追加のレンダリングでカートに追加ボタンを無効化できます。
-   CXAEvent.BundleStockStatusValidは現在のバンドル選択の在庫状況が有効であることを示すイベントを発行し、プロダクトバンドルはバンドル選択の価格を要求できます。イベントの引数:

{
  productId: String
}

-   CXAEvent.GetStockInfo: Product Inventoryレンダリングは、APIエンドポイントCatalog/GetCurrentProductStockInfo.Eventの引数から応答が受信されるとこのイベントを発生させます:

{
  productId: String,
  stockInfos: Array
}

-   CXAEvent.DiscountApplied: CXACartContextサービスはAPIエンドポイント Cart/ApplyDiscountに呼び出した後にイベントを発します。
-   CXAEvent.DiscountRemoved: CXACartContextサービスはAPIエンドポイント Cart/RemoveDiscountに呼び出した後にイベントを発します。