UNPKG

olympus-r

Version:

一个力求简单易用的前端开发框架 #### 开发语言 TypeScript #### 核心架构 MVC #### 模块间通讯和解耦 采用事件机制,利用一个全局唯一的事件派发器进行模块间通讯,解耦模块间依赖 #### 表现层结构 使用桥接模式拆分接口与实现,达到一套核心驱动多套表现层的目的(目前支持DOM、Egret、PixiJS三种表现层),同时支持表现层的未来可扩展性 #### TypeScript装饰器注入 框架提供TypeScript装饰器注入功能,便捷获取托管对象。例如:

522 lines (521 loc) 16 kB
import ICommandConstructor from "../../core/command/ICommandConstructor"; import JSFile from '../../core/interfaces/JSFile'; import IMessage from "../../core/message/IMessage"; import IObservable from "../../core/observable/IObservable"; import Dictionary from "../../utils/Dictionary"; import IBridge from "../bridge/IBridge"; import RequestData from "../net/RequestData"; import ResponseData from "../net/ResponseData"; import { ICancelable } from "../system/System"; import IMediator from "./IMediator"; import IMediatorConstructor from "./IMediatorConstructor"; import { ModuleOpenStatus } from "./IMediatorModulePart"; import MediatorStatus from "./MediatorStatus"; /** * @author Raykid * @email initial_r@qq.com * @create date 2017-09-04 * @modify date 2017-09-04 * * 组件界面中介者基类 */ /** 规定ModuleManager支持的模块参数类型 */ export declare type ModuleType = IMediatorConstructor | IMediator; /** * 注册模块 * * @export * @param {string} moduleName 模块名 * @param {IMediatorConstructor} cls 模块类型 */ export declare function registerModule(moduleName: string, cls: IMediatorConstructor): void; /** * 获取模块类型 * * @export * @param {string} moduleName 模块名 * @returns {IMediatorConstructor} */ export declare function getModule(moduleName: string): IMediatorConstructor; /** * 获取模块名 * * @export * @param {ModuleType} type 模块实例或模块类型 * @returns {string} 模块名 */ export declare function getModuleName(type: ModuleType): string; export declare function isMediator(target: any): boolean; /** * 中介者基类 * * @author Raykid * @date 2019-03-04 * @export * @class Mediator * @implements {IMediator<S, OD, CD>} * @template S 皮肤类型 * @template OD 开启参数类型 * @template CD 关闭参数类型 */ export default class Mediator<S = any, OD = any, CD = any> implements IMediator<S, OD, CD> { private _status; /** * 获取中介者状态 * * @readonly * @type {MediatorStatus} * @memberof Mediator */ readonly status: MediatorStatus; /** * 表现层桥 * * @type {IBridge} * @memberof Mediator */ bridge: IBridge<S>; private _viewModel; /** * 获取或设置ViewModel * * @type {*} * @memberof Mediator */ viewModel: any; /** * 绑定目标数组,第一层key是调用层级,第二层是该层级需要编译的对象数组 * * @type {Dictionary<S, S>[]} * @memberof Mediator */ bindTargets: Dictionary<S, S>[]; /** * 皮肤 * * @type {S} * @memberof Mediator */ skin: S; /** * 原始皮肤,即传入构造函数的皮肤 * * @type {S} * @memberof Mediator */ oriSkin: S; /** * 获取中介者是否已被销毁 * * @readonly * @type {boolean} * @memberof Mediator */ readonly disposed: boolean; /** * 打开时传递的data对象 * * @type {OD} * @memberof Mediator */ data: OD; private _openMask; /** * 开启时是否触发全屏遮罩,防止用户操作,设置操作会影响所有子孙中介者。默认是true * * @type {boolean} * @memberof Mediator */ openMask: boolean; private _responses; /** * 模块初始消息的返回数据 * * @type {ResponseData[]} * @memberof Mediator */ responses: ResponseData[]; private _moduleName; /** * 获取模块名 * * @readonly * @type {string} * @memberof Mediator */ readonly moduleName: string; /** * 模块打开结果回调函数,由moduleManager调用,不要手动调用 * * @memberof Mediator */ moduleOpenHandler: (status: ModuleOpenStatus, err?: Error) => void; constructor(skin?: S); /** * 加载从listAssets中获取到的所有资源 * * @param {(err?:Error)=>void} handler 加载完毕后的回调,如果出错则会给出err参数 * @returns {void} * @memberof Mediator */ loadAssets(handler: (err?: Error) => void): void; /** * 加载从listStyleFiles中获取到的所有资源 * * @param {(err?:Error)=>void} handler 加载完毕后的回调,如果出错则会给出err参数 * @memberof IMediator */ loadStyleFiles(handler: (err?: Error) => void): void; /** * 加载从listJsFiles中获取到的所有资源 * * @param {(err?:Error)=>void} handler 加载完毕后的回调,如果出错则会给出err参数 * @memberof IMediator */ loadJsFiles(handler: (err?: Error) => void): void; /** * 发送从listInitRequests中获取到的所有资源 * * @param {(err?:Error)=>void} handler 加载完毕后的回调,如果出错则会给出err参数 * @memberof IMediator */ sendInitRequests(handler: (err?: Error) => void): void; /** * 当所需资源加载完毕后调用 * * @param {Error} [err] 加载出错会给出错误对象,没错则不给 * @memberof Mediator */ onLoadAssets(err?: Error): void; /** * 当所需CSS加载完毕后调用 * * @param {Error} [err] 加载出错会给出错误对象,没错则不给 * @memberof Mediator */ onLoadStyleFiles(err?: Error): void; /** * 当所需js加载完毕后调用 * * @param {Error} [err] 加载出错会给出错误对象,没错则不给 * @memberof Mediator */ onLoadJsFiles(err?: Error): void; /** * 当所需资源加载完毕后调用 * * @param {Error} [err] 加载出错会给出错误对象,没错则不给 * @memberof Mediator */ onSendInitRequests(err?: Error): void; /** * 当获取到所有初始化请求返回时调用,可以通过返回一个true来阻止模块的打开 * * @param {ResponseData[]} responses 返回结构数组 * @returns {boolean} 返回true则表示停止模块打开 * @memberof Mediator */ onGetResponses(responses: ResponseData[]): boolean; private _openPromiseData; /** * 异步获取开启数据 * * @readonly * @type {Promise<OD>} * @memberof Mediator */ readonly openData: Promise<OD>; /** * 打开,为了实现IOpenClose接口 * * @param {OD} [data] 开启数据 * @param {...any[]} args 其他数据 * @returns {Promise<any>} 异步返回onOpen时返回的参数 * @memberof Mediator */ open(data?: OD, ...args: any[]): Promise<any>; protected __beforeOnOpen(data?: OD, ...args: any[]): void | Promise<void>; protected __afterOnOpen(data?: OD, ...args: any[]): void | Promise<void>; private _closePromiseData; private _closeData; /** * 异步获取关闭参数 * * @readonly * @type {Promise<CD>} * @memberof Mediator */ readonly closeData: Promise<CD>; /** * 关闭,为了实现IOpenClose接口 * * @param {CD} [data] 关闭数据 * @param {...any[]} args 其他参数 * @returns {Promise<any>} 异步返回onClose时返回的参数 * @memberof Mediator */ close(data?: CD, ...args: any[]): Promise<any>; protected __beforeOnClose(data?: CD, ...args: any[]): void; protected __afterOnClose(data?: CD, ...args: any[]): void; /** * 当打开时调用 * * @param {OD} [data] 可能的打开参数 * @param {...any[]} args 其他参数 * @returns {any|Promise<any>} 若返回对象则使用该对象替换传入的data进行后续开启操作 * @memberof Mediator */ onOpen(data?: OD, ...args: any[]): any | Promise<any>; /** * 当关闭时调用 * * @param {CD} [data] 可能的关闭参数 * @param {...any[]} args 其他参数 * @returns {any|Promise<any>} 若返回对象则使用该对象当做close操作的返回值 * @memberof Mediator */ onClose(data?: CD, ...args: any[]): any | Promise<any>; private _listeners; /** * 监听事件,从这个方法监听的事件会在中介者销毁时被自动移除监听 * * @param {S} target 事件目标对象 * @param {string} type 事件类型 * @param {Function} handler 事件处理函数 * @param {*} [thisArg] this指向对象 * @memberof Mediator */ mapListener(target: S, type: string, handler: Function, thisArg?: any): void; /** * 注销监听事件 * * @param {S} target 事件目标对象 * @param {string} type 事件类型 * @param {Function} handler 事件处理函数 * @param {*} [thisArg] this指向对象 * @memberof Mediator */ unmapListener(target: S, type: string, handler: Function, thisArg?: any): void; /** * 注销所有注册在当前中介者上的事件监听 * * @memberof Mediator */ unmapAllListeners(): void; private _disposeDict; private disposeChild; /** * 父中介者 * * @type {IMediator} * @memberof Mediator */ parent: IMediator; /** * 获取根级中介者(当做模块直接被打开的中介者) * * @type {IMediator} * @memberof IMediator */ readonly root: IMediator; protected _children: IMediator[]; /** * 获取所有子中介者 * * @type {IMediator[]} * @memberof Mediator */ readonly children: IMediator[]; /** * 托管子中介者 * * @param {IMediator} mediator 要托管的中介者 * @memberof Mediator */ delegateMediator(mediator: IMediator): void; /** * 取消托管子中介者 * * @param {IMediator} mediator 要取消托管的中介者 * @memberof Mediator */ undelegateMediator(mediator: IMediator): void; /** * 判断指定中介者是否包含在该中介者里(判断范围包括当前中介者和子孙级中介者) * * @param {IMediator} mediator 要判断的中介者 * @returns {boolean} * @memberof Mediator */ containsMediator(mediator: IMediator): boolean; private _cancelables; /** * 托管ICancelable实例 * * @author Raykid * @date 2019-05-13 * @param {ICancelable} cancelable * @memberof Mediator */ delegateCancelable(cancelable: ICancelable): void; /** * 取消托管ICancelable实例 * * @author Raykid * @date 2019-05-13 * @param {ICancelable} cancelable * @memberof Mediator */ undelegateCancelable(cancelable: ICancelable): void; cancelAll(): void; /** * 其他模块被关闭回到当前模块时调用 * * @param {(IMediator|undefined)} from 从哪个模块回到当前模块 * @param {*} [data] 可能的参数传递 * @memberof Mediator */ wakeUp(from: IMediator | undefined, data?: any): void; /** * 模块切换到前台时调用(与wakeUp的区别是open时activate会触发,但wakeUp不会) * * @param {(IMediator|undefined)} from 从哪个模块来到当前模块 * @param {*} [data] 可能的参数传递 * @memberof Mediator */ activate(from: IMediator | undefined, data?: any): void; /** * 模块切换到后台时调用(close之后或者其他模块打开时) * * @param {(IMediator|undefined)} to 将要去往哪个模块 * @param {*} [data] 可能的参数传递 * @memberof Mediator */ deactivate(to: IMediator | undefined, data?: any): void; /** * 列出中介者所需的资源数组,可重写 * * @returns {string[]} * @memberof Mediator */ listAssets(): string[]; /** * 列出所需CSS资源URL,可重写 * * @returns {string[]} * @memberof Mediator */ listStyleFiles(): string[]; /** * 列出所需JS资源URL,可重写 * * @returns {JSFile[]} * @memberof Mediator */ listJsFiles(): JSFile[]; /** * 列出模块初始化请求,可重写 * * @returns {RequestData[]} * @memberof Mediator */ listInitRequests(): RequestData[]; /** * 其他模块被关闭回到当前模块时调用 * * @param {(IMediator|undefined)} from 从哪个模块回到当前模块 * @param {*} [data] 可能的参数传递 * @memberof Mediator */ onWakeUp(from: IMediator | undefined, data?: any): void; /** * 模块切换到前台时调用(与onWakeUp的区别是open时onActivate会触发,但onWakeUp不会) * * @param {(IMediator|undefined)} from 从哪个模块来到当前模块 * @param {*} [data] 可能的参数传递 * @memberof Mediator */ onActivate(from: IMediator | undefined, data?: any): void; /** * 模块切换到后台时调用(close之后或者其他模块打开时) * * @param {(IMediator|undefined)} to 将要去往哪个模块 * @param {*} [data] 可能的参数传递 * @memberof Mediator */ onDeactivate(to: IMediator | undefined, data?: any): void; /*********************** 下面是模块消息系统 ***********************/ private _observable; /** * 暴露IObservable * * @readonly * @type {IObservable} * @memberof Mediator */ readonly observable: IObservable; /** * 派发消息 * * @param {IMessage} msg 内核消息实例 * @memberof Mediator */ dispatch(msg: IMessage): void; /** * 派发消息,消息会转变为Message类型对象 * * @param {string} type 消息类型 * @param {...any[]} params 消息参数列表 * @memberof Mediator */ dispatch(type: string, ...params: any[]): void; /** * 监听消息 * * @param {string} type 消息类型 * @param {Function} handler 消息处理函数 * @param {*} [thisArg] 消息this指向 * @param {boolean} [once=false] 是否是一次性监听 * @memberof Mediator */ listen(type: IConstructor | string, handler: Function, thisArg?: any, once?: boolean): void; /** * 移除消息监听 * * @param {string} type 消息类型 * @param {Function} handler 消息处理函数 * @param {*} [thisArg] 消息this指向 * @param {boolean} [once=false] 是否是一次性监听 * @memberof Mediator */ unlisten(type: IConstructor | string, handler: Function, thisArg?: any, once?: boolean): void; /** * 注册命令到特定消息类型上,当这个类型的消息派发到框架内核时会触发Command运行 * * @param {string} type 要注册的消息类型 * @param {(ICommandConstructor)} cmd 命令处理器,可以是方法形式,也可以使类形式 * @memberof Mediator */ mapCommand(type: string, cmd: ICommandConstructor): void; /** * 注销命令 * * @param {string} type 要注销的消息类型 * @param {(ICommandConstructor)} cmd 命令处理器 * @returns {void} * @memberof Mediator */ unmapCommand(type: string, cmd: ICommandConstructor): void; /** * 销毁中介者 * * @memberof Mediator */ dispose(): void; /** * 当销毁时调用 * * @memberof Mediator */ onDispose(): void; }