export interface NavDataElement { /** * 主键标识 * * @memberof NavDataElement */ id: string; /** * 视图标题 * * @memberof NavDataElement */ title: any; /** * 上下文 * * @memberof NavDataElement */ context:any; /** * 视图参数 * * @memberof NavDataElement */ viewparams:any; /** * 视图数据 * * @memberof NavDataElement */ data:any; /** * 视图路径 * * @memberof NavDataElement */ path:string; /** * 元素主键 * * @memberof NavDataElement */ srfkey:string|null; /** * 视图标识 * * @memberof NavDataElement */ tag:string|null; } export interface ServiceState { /** * 行为 * * @memberof ServiceState */ action: string; /** * 名称 * * @memberof ServiceState */ name: any; /** * 数据 * * @memberof ServiceState */ data: any; } import { Subject } from 'rxjs'; /** * 导航数据服务 * * @export * @class CodeListService */ export default class NavDataService { /** * 单例变量声明 * * @private * @static * @type {NavDataService} * @memberof NavDataService */ private static navDataService: NavDataService; /** * 缓存对象 * * @private * @type {(any)} * @memberof NavDataService */ private static store: any; /** * 服务状态 * * @memberof NavDataService */ public serviceState: Subject<ServiceState> = new Subject(); /** * 导航数据栈 * * @memberof NavDataService */ public navDataStack:Array<NavDataElement> = []; /** * 导航数据存储仓库 * * @memberof NavDataService */ public sessionStore:any; /** * 初始化实例 * * @memberof NavDataService */ constructor(opts:any = {}){ this.sessionStore = window.sessionStorage; this.initNavData(); } /** * 获取 NavDataService 单例对象 * * @static * @returns {NavDataService} * @memberof NavDataService */ public static getInstance(store: any): NavDataService { if (!NavDataService.navDataService) { NavDataService.navDataService = new NavDataService(); } this.store = store; return this.navDataService; } /** * 初始化基础导航数据 * * @memberof NavDataService */ public initNavData(){ if(this.sessionStore && this.sessionStore.getItem('srfnavdata')){ this.navDataStack = JSON.parse(this.sessionStore.getItem('srfnavdata')); } } /** * 添加基础导航数据到栈中 * * @memberof NavDataService */ public addNavData(curNavData:NavDataElement){ if(this.navDataStack.length >0){ let tempIndex:number = this.navDataStack.findIndex((element:NavDataElement) =>{ return Object.is(element.id,curNavData.id); }) if(tempIndex === -1){ this.navDataStack.push(curNavData); this.sessionStore.setItem('srfnavdata',JSON.stringify(this.navDataStack)); return curNavData; }else{ this.setNavDataById(curNavData.id,curNavData); } }else{ this.navDataStack.push(curNavData); this.sessionStore.setItem('srfnavdata',JSON.stringify(this.navDataStack)); return curNavData; } this.serviceState.next({action:'datarefresh',name:null,data:this.navDataStack}); } /** * 设置指定数据到基础导航数据栈中 * * @memberof NavDataService */ public setNavDataById(id:string,curNavData:NavDataElement){ if(this.navDataStack.length >0){ let tempIndex:number = this.navDataStack.findIndex((element:NavDataElement) =>{ return Object.is(element.id,id); }) this.navDataStack[tempIndex] = curNavData; this.sessionStore.setItem('srfnavdata',JSON.stringify(this.navDataStack)); return curNavData; }else{ return null; } } /** * 从导航数据栈中删除指定数据上层数据 * * @memberof NavDataService */ public removeNavData(id:string){ if(this.navDataStack.length >0){ let tempIndex:number = this.navDataStack.findIndex((element:NavDataElement) =>{ return Object.is(element.id,id); }) let removeNavData = this.navDataStack.splice(tempIndex+1); if(removeNavData && removeNavData.length >0){ removeNavData.forEach((navData:any) =>{ NavDataService.store.commit("deletePage", navData.path); }) } this.sessionStore.setItem('srfnavdata',JSON.stringify(this.navDataStack)); return removeNavData; }else{ return null; } } /** * 从导航数据栈中删除指定数据上层数据(不清除页面缓存) * * @memberof NavDataService */ public removeNavDataWithoutCache(id:string){ if(this.navDataStack.length >0){ let tempIndex:number = this.navDataStack.findIndex((element:NavDataElement) =>{ return Object.is(element.id,id); }) let removeNavData = this.navDataStack.splice(tempIndex+1); this.sessionStore.setItem('srfnavdata',JSON.stringify(this.navDataStack)); return removeNavData; }else{ return null; } } /** * 从导航数据栈中获取指定数据 * * @memberof NavDataService */ public getNavDataById(id:string){ if(this.navDataStack.length >0){ let tempIndex:number = this.navDataStack.findIndex((element:NavDataElement) =>{ return Object.is(element.id,id); }) return this.navDataStack[tempIndex]; }else{ return null; } } /** * 从导航数据栈中获取指定数据的前一条数据 * * @memberof NavDataService */ public getPreNavDataById(id:string){ if(this.navDataStack.length >0){ let tempIndex:number = this.navDataStack.findIndex((element:NavDataElement) =>{ return Object.is(element.id,id); }) return this.navDataStack[tempIndex-1]; }else{ return null; } } /** * 清空导航数据栈数据 * * @memberof NavDataService */ public clearNavData(id:string){ this.navDataStack = []; this.sessionStore.setItem('srfnavdata',JSON.stringify(this.navDataStack)); } /** * 从导航数据栈中获取数据 * * @memberof NavDataService */ public getNavData(){ if(this.navDataStack && this.navDataStack.length >0){ this.navDataStack.forEach((item:any,index) =>{ if(item && item.data && this.navDataStack[index+1]){ this.navDataStack[index+1] = Object.assign(this.navDataStack[index+1],{isselected:true}); } }) return this.navDataStack; }else{ return []; } } /** * 从导航数据栈中直接添加数据 * * @memberof NavDataService */ public addNavDataByOnly(curNavData:NavDataElement,isOnlyAdd:boolean){ if(isOnlyAdd){ this.navDataStack.push(curNavData); }else{ if(this.navDataStack.length >0){ let tempIndex:number = this.navDataStack.findIndex((element:NavDataElement) =>{ return Object.is(element.tag,curNavData.tag); }) if(tempIndex === -1){ this.navDataStack.push(curNavData); }else{ this.navDataStack[tempIndex] = curNavData; } }else{ this.navDataStack.push(curNavData); } } this.sessionStore.setItem('srfnavdata',JSON.stringify(this.navDataStack)); return curNavData; } /** * 从导航数据栈中直接删除数据 * * @memberof NavDataService */ public removeNavDataByTag(viewtag:string){ if(this.navDataStack.length >0){ let tempIndex:number = this.navDataStack.findIndex((element:NavDataElement) =>{ return Object.is(element.tag,viewtag); }) let removeNavData = this.navDataStack.splice(tempIndex,1); this.sessionStore.setItem('srfnavdata',JSON.stringify(this.navDataStack)); return removeNavData; }else{ return null; } } /** * 从导航数据栈中获取指定元素前一个元素 * * @memberof NavDataService */ public getPreNavDataByTag(viewtag:string){ if(this.navDataStack.length >0){ let tempIndex:number = this.navDataStack.findIndex((element:NavDataElement) =>{ return Object.is(element.tag,viewtag); }) return this.navDataStack[tempIndex - 1]?this.navDataStack[tempIndex - 1]:null; }else{ return null; } } /** * 从导航数据栈中删除所有数据 * * @memberof NavDataService */ public removeAllNavData(){ if(this.navDataStack.length >0){ this.navDataStack = []; this.sessionStore.setItem('srfnavdata',JSON.stringify(this.navDataStack)); } } }