Spartacus 注册和登录页面的实现细节

先查看登录按钮的实现,选择器为 cx-register

Spartacus 注册和登录页面的实现细节_第1张图片

user-register.service.ts 里,使用了 command 模式,注意 uid 里的 +,并没有进行任何处理。

Spartacus 注册和登录页面的实现细节_第2张图片

command 最终投递到 occ-user-profile.adapter.ts 文件中的 register 方法里,调用 Angular HTTP Library 的 post 方法进行投递。注意上图45 行代码,Content-Type 的值为 application/json.

Spartacus 注册和登录页面的实现细节_第3张图片

Spartacus 事件服务提供了一个事件流,开发人员无需紧密集成到特定组件或模块即可使用这些事件流。事件系统在 Spartacus 中用于构建与第三方系统的集成,例如标签管理器和 Web 跟踪器。

事件服务还允许开发人员解耦某些组件。 例如,我们可能有一个分派事件的组件,以及另一个对该事件作出反应的组件,而无需组件之间的任何硬依赖。

事件服务利用 RxJs Observables 来驱动事件流。

事件由 TypeScript 类驱动,它们是给定事件的签名并且可以被实例化。 下面是一个例子:

import { CxEvent } from "@spartacus/core";
export class CartAddEntryEvent extends CxEvent {
  cartId: string;
  userId: string;
  productCode: string;
  quantity: number;
}

要观察给定类型的事件,可以获取事件类型的流,然后在需要时订阅它。 以下是 CartAddEntryEvent 调用的示例:

constructor(events: EventService){}
/* ... */

const result$ = this.events.get(CartAddEntrySuccessEvent);
result$.subscribe((event) => console.log(event));

如果开发人员需要的数据多于特定事件中包含的数据,则可以将此数据与其他流结合起来。 例如,我们可以从 facade 收集其他数据。

下面是一个响应 添加到购物车事件 的示例,然后等待购物车稳定(因为 OCC 购物车需要从后端重新加载),然后将所有购物车数据附加到事件数据:

constructor(
    events: EventService,
    cartService: ActiveCartService
    ){}
/* ... */

const result$ = this.events.get(CartAddEntrySuccessEvent).pipe(
    // When the above event is captured, wait for the cart to be stable
    // (because OCC reloads the cart after any cart operation)...
    switchMap((event) =>
        this.cartService.isStable().pipe(filter(Boolean), mapTo(event))
    ),
    // Merge the state snapshot of the cart with the data from the event:
    withLatestFrom(this.cartService.getActive()),
    map(([event, cart]) => ({ ...event, cart }))
);

你可能感兴趣的:(Spartacus 注册和登录页面的实现细节)