当前位置: 首页 > Web前端 > JavaScript

InjectionToken在SAP电商云SpartacusUI中的应用场景

时间:2023-03-27 17:55:59 JavaScript

看一个具体的例子:InjectionToken的构造函数需要传入一个类型参数进去。这个ActionReducerMap的定义很讲究:exportdeclaretypeActionReducerMap={[pinkeyofT]:ActionReducer;};使用该类型时,需要传入两个类型参数T和V,其中V的默认值为Action.ActionReducerMap描述了一个对象,该对象的字段名必须是State字段之一,而这个的类型字段为ActionReducer看一下,State类型的字段名正好是ROUTING_FEATURE,即'router':也就是下图中红色高亮区域:路由器的类型呢?一定是ActionReducerState[p]=State['router'],也就是我们自定义的RouterState。也就是说,ActionReducer的第一个类型参数是T,变成了RouterState.ActionReducer={function}括号里面是一个function,入参有两个:state:类型是RouterStateaction:参数是Action,返回参数类型是RouterState,这和我们应用代码中定义的一模一样:在使用注入Token时,每当你想要注入的类型无法确定时(没有运行时表示),例如,在注入接口、可调用类型、数组或参数化类型时,应使用InjectionToken.Token构造函数中的类型参数T:InjectionToken的参数对T的优化版本,T是Injector返回的对象的类型。这提供了更高级别的类型安全。以下是InjectionToken创建的几种方法。方法一constBASE_URL=newInjectionToken('BaseUrl');constinjector=Injector.create({providers:[{provide:BASE_URL,useValue:'http://localhost'}]});consturl=注入器。get(BASE_URL);//这里`url`被推断为`string`因为`BASE_URL`是`InjectionToken`.expect(url).toBe('http://localhost');方法二:创建Tree-shaking优化注入令牌classMyService{constructor(readonlymyDep:MyDep){}}constMY_SERVICE_TOKEN=newInjectionToken('ManuallyconstructedMyService',{providedIn:'root',factory:()=>newMyService(注入(MyDep)),});constinstance=injector.get(MY_SERVICE_TOKEN);期望(实例instanceofMyService).toBeTruthy();期望(instance.myDepinstanceofMyDep).toBeTruthy();请参阅Spartacus示例:路由。module.ts中提供了reducerToken和reducerTokenproviders的实现:采用工厂实现:reducerProvider维护reducerToken以及如何提供其工厂,什么时候引用reducerProvider?答案是在RoutingModule中配置的:最后我通过下面的代码获取token对对应的runtime实例:constructor(_injector:Injector){constjerry=_injector.get(reducerToken);console.log('Jerry令牌:',jerry);}是一个reducer函数:这个函数定义如下:更多Jerry原创文章都在这里:《汪子熙》: