Spartacus事件服务提供了一个事件流,开发人员可以在不与特定组件或模块紧密集成的情况下使用该事件流。在Spartacus中,事件系统用于构建与第三方系统(例如标签管理和cookie)的集成。从event.service.ts文件导入EventService:事件服务还允许开发人员解耦某些组件。例如,可能有一个组件调度事件,即事件的生产者,以及另一个响应事件的组件,即事件的侦听器。两者之间不需要任何硬依赖。事件由TypeScript类驱动,这些类是给定事件的签名并且可以实例化。示例如下:import{CxEvent}from"@spartacus/core";导出类CartAddEntryEvent扩展CxEvent{car??tId:string;用户ID:字符串;产品代码:字符串;quantity:number;}下图是另一个LanguageSetEvent,继承自CxEvent,在这个基础上增加了activeLanguage属性:如何监听一个事件?要观察给定类型的事件,可以获取事件类型的流,然后在需要时订阅它。下面是CartAddEntryEvent监听的例子:constructor(events:EventService){}/*...*/constresult$=this.events.get(CartAddEntrySuccessEvent);result$.subscribe((event)=>console.log(事件));如果您需要比特定事件中包含的数据更多的数据,您可以将该数据与其他流合并。例如,可以从Spartacusfacade收集额外的数据。下面是响应“添加到购物车事件”的示例,然后等待购物车处于稳定状态(因为OCC购物车需要从后端重新加载),然后将所有购物车数据追加到数据中theevent:constructor(events:EventService,cartService:ActiveCartService){}/*...*/constresult$=this.events.get(CartAddEntrySuccessEvent).pipe(//当捕获到上述事件时,等待购物车稳定//(因为OCC在任何购物车操作后重新加载购物车)...switchMap((event)=>this.cartService.isStable().pipe(filter(Boolean),mapTo(event))),//将购物车的状态快照与事件数据合并:withLatestFrom(this.cartService.getActive()),map(([event,cart])=>({...event,cart})));上面代码的关键点:switchMap需要返回一个Observable对象。在进行后续处理之前,使用过滤器确保Cart处于Stable状态。mapTo事件丢弃CartStable状态,并重新映射回带有LatestFrom的事件对象:从cartService读取稳定的Cart数据。这时候前面的filter操作可以保证Cart一定是Stable的。
