UNPKG

olympus-r

Version:

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

1,160 lines (1,159 loc) 44.1 kB
import * as tslib_1 from "tslib"; import { core } from "../../core/Core"; import Observable from "../../core/observable/Observable"; import { unique } from "../../utils/ArrayUtil"; import { getConstructor } from "../../utils/ConstructUtil"; import Dictionary from "../../utils/Dictionary"; import { assetsManager } from "../assets/AssetsManager"; import { bindManager } from "../bind/BindManager"; import { mutate, unmutate } from "../bind/Mutator"; import { bridgeManager } from '../bridge/BridgeManager'; import { maskManager } from "../mask/MaskManager"; import { netManager } from "../net/NetManager"; import { system } from "../system/System"; import { ModuleOpenStatus } from "./IMediatorModulePart"; import MediatorMessage from "./MediatorMessage"; import MediatorStatus from "./MediatorStatus"; var moduleDict = {}; var moduleNameDict = new Dictionary(); /** * 注册模块 * * @export * @param {string} moduleName 模块名 * @param {IMediatorConstructor} cls 模块类型 */ export function registerModule(moduleName, cls) { moduleDict[moduleName] = cls; moduleNameDict.set(cls, moduleName); } /** * 获取模块类型 * * @export * @param {string} moduleName 模块名 * @returns {IMediatorConstructor} */ export function getModule(moduleName) { return moduleDict[moduleName]; } /** * 获取模块名 * * @export * @param {ModuleType} type 模块实例或模块类型 * @returns {string} 模块名 */ export function getModuleName(type) { var cls = getConstructor(type instanceof Function ? type : type.constructor); return moduleNameDict.get(cls); } export function isMediator(target) { return (target.delegateMediator instanceof Function && target.undelegateMediator instanceof Function); } /** * 中介者基类 * * @author Raykid * @date 2019-03-04 * @export * @class Mediator * @implements {IMediator<S, OD, CD>} * @template S 皮肤类型 * @template OD 开启参数类型 * @template CD 关闭参数类型 */ var Mediator = /** @class */ (function () { function Mediator(skin) { this._status = MediatorStatus.UNOPEN; /** * 绑定目标数组,第一层key是调用层级,第二层是该层级需要编译的对象数组 * * @type {Dictionary<S, S>[]} * @memberof Mediator */ this.bindTargets = []; this._openMask = true; this._listeners = []; this._disposeDict = new Dictionary(); /** * 父中介者 * * @type {IMediator} * @memberof Mediator */ this.parent = null; this._children = []; this._cancelables = []; /*********************** 下面是模块消息系统 ***********************/ this._observable = new Observable(core); // 赋值模块名称 this._moduleName = getModuleName(this); // 赋值皮肤 if (skin) { this.skin = skin; // 赋值桥 this.bridge = bridgeManager.getBridgeBySkin(skin); } this.oriSkin = skin; // 初始化绑定 bindManager.bind(this); // 生成开启Promise数据 var openResolve; var openReject; var openPromise = new Promise(function (resolve, reject) { openResolve = resolve; openReject = reject; }); this._openPromiseData = [openPromise, openResolve, openReject]; // 生成关闭Promise数据 var closeResolve; var closeReject; var closePromise = new Promise(function (resolve, reject) { closeResolve = resolve; closeReject = reject; }); this._closePromiseData = [closePromise, closeResolve, closeReject]; } Object.defineProperty(Mediator.prototype, "status", { /** * 获取中介者状态 * * @readonly * @type {MediatorStatus} * @memberof Mediator */ get: function () { return this._status; }, enumerable: true, configurable: true }); Object.defineProperty(Mediator.prototype, "viewModel", { /** * 获取或设置ViewModel * * @type {*} * @memberof Mediator */ get: function () { return this._viewModel; }, set: function (value) { // 设置的时候进行一次变异 this._viewModel = mutate(value); // 更新绑定 bindManager.bind(this); }, enumerable: true, configurable: true }); Object.defineProperty(Mediator.prototype, "disposed", { /** * 获取中介者是否已被销毁 * * @readonly * @type {boolean} * @memberof Mediator */ get: function () { return (this._status === MediatorStatus.DISPOSED); }, enumerable: true, configurable: true }); Object.defineProperty(Mediator.prototype, "openMask", { /** * 开启时是否触发全屏遮罩,防止用户操作,设置操作会影响所有子孙中介者。默认是true * * @type {boolean} * @memberof Mediator */ get: function () { return this._openMask; }, set: function (value) { this._openMask = value; // 递归设置所有子中介者的openMask for (var _i = 0, _a = this._children; _i < _a.length; _i++) { var child = _a[_i]; child.openMask = value; } }, enumerable: true, configurable: true }); Object.defineProperty(Mediator.prototype, "responses", { /** * 模块初始消息的返回数据 * * @type {ResponseData[]} * @memberof Mediator */ get: function () { return this._responses; }, set: function (value) { this._responses = value; // 递归设置子中介者的data for (var _i = 0, _a = this._children; _i < _a.length; _i++) { var mediator = _a[_i]; mediator.responses = value; } }, enumerable: true, configurable: true }); Object.defineProperty(Mediator.prototype, "moduleName", { /** * 获取模块名 * * @readonly * @type {string} * @memberof Mediator */ get: function () { return this._moduleName; }, enumerable: true, configurable: true }); /** * 加载从listAssets中获取到的所有资源 * * @param {(err?:Error)=>void} handler 加载完毕后的回调,如果出错则会给出err参数 * @returns {void} * @memberof Mediator */ Mediator.prototype.loadAssets = function (handler) { var _this = this; var mediators = this._children.concat(); var temp = function (err) { if (err || mediators.length <= 0) { // 调用onLoadAssets接口 _this.onLoadAssets(err); // 调用回调 handler(err); } else { // 加载一个子中介者的资源 var mediator = mediators.shift(); mediator.loadAssets(temp); } }; // 加载自身资源 var assets = this.listAssets(); if (assets && assets.length > 0) { // 去重 assets = unique(assets); // 开始加载 this.bridge.loadAssets(assets, this, temp); } else { // 没有资源,直接调用回调 handler(); } }; /** * 加载从listStyleFiles中获取到的所有资源 * * @param {(err?:Error)=>void} handler 加载完毕后的回调,如果出错则会给出err参数 * @memberof IMediator */ Mediator.prototype.loadStyleFiles = function (handler) { var _this = this; var mediators = this._children.concat(); var temp = function (err) { if (err || mediators.length <= 0) { // 调用onLoadStyleFiles接口 _this.onLoadStyleFiles(err); // 调用回调 handler(err); } else { // 加载一个子中介者的资源 var mediator = mediators.shift(); mediator.loadStyleFiles(temp); } }; // 开始加载css文件 var cssFiles = this.listStyleFiles(); // 去重 cssFiles = unique(cssFiles); // 加载 assetsManager.loadStyleFiles(cssFiles, temp); }; /** * 加载从listJsFiles中获取到的所有资源 * * @param {(err?:Error)=>void} handler 加载完毕后的回调,如果出错则会给出err参数 * @memberof IMediator */ Mediator.prototype.loadJsFiles = function (handler) { var _this = this; var mediators = this._children.concat(); var temp = function (err) { if (err || mediators.length <= 0) { // 调用onLoadJsFiles接口 _this.onLoadJsFiles(err); // 调用回调 handler(err); } else { // 加载一个子中介者的js var mediator = mediators.shift(); mediator.loadJsFiles(temp); } }; // 开始加载js文件 var jsFiles = this.listJsFiles(); // 去重 jsFiles = unique(jsFiles); // 加载 assetsManager.loadJsFiles(jsFiles, temp); }; /** * 发送从listInitRequests中获取到的所有资源 * * @param {(err?:Error)=>void} handler 加载完毕后的回调,如果出错则会给出err参数 * @memberof IMediator */ Mediator.prototype.sendInitRequests = function (handler) { var _this = this; var mediators = this._children.concat(); var temp = function (responses) { if (responses instanceof Error) { var err = responses instanceof Error ? responses : undefined; // 调用onSendInitRequests接口 _this.onSendInitRequests(err); // 调用回调 handler(err); } else { if (isMine) { isMine = false; // 赋值返回值 _this.responses = responses; // 调用回调 var stop = _this.onGetResponses(responses); if (stop) { var err = new Error("用户中止打开模块操作"); // 调用onSendInitRequests接口 _this.onSendInitRequests(err); // 调用回调 handler(err); return; } } if (mediators.length <= 0) { // 调用onSendInitRequests接口 _this.onSendInitRequests(); // 调用回调 handler(); } else { // 发送一个子中介者的初始化消息 var mediator = mediators.shift(); mediator.sendInitRequests(temp); } } }; // 发送所有模块消息,模块消息默认发送全局内核 var isMine = true; netManager.sendMultiRequests(this.listInitRequests(), temp, this, this.observable); }; /** * 当所需资源加载完毕后调用 * * @param {Error} [err] 加载出错会给出错误对象,没错则不给 * @memberof Mediator */ Mediator.prototype.onLoadAssets = function (err) { }; /** * 当所需CSS加载完毕后调用 * * @param {Error} [err] 加载出错会给出错误对象,没错则不给 * @memberof Mediator */ Mediator.prototype.onLoadStyleFiles = function (err) { }; /** * 当所需js加载完毕后调用 * * @param {Error} [err] 加载出错会给出错误对象,没错则不给 * @memberof Mediator */ Mediator.prototype.onLoadJsFiles = function (err) { }; /** * 当所需资源加载完毕后调用 * * @param {Error} [err] 加载出错会给出错误对象,没错则不给 * @memberof Mediator */ Mediator.prototype.onSendInitRequests = function (err) { }; /** * 当获取到所有初始化请求返回时调用,可以通过返回一个true来阻止模块的打开 * * @param {ResponseData[]} responses 返回结构数组 * @returns {boolean} 返回true则表示停止模块打开 * @memberof Mediator */ Mediator.prototype.onGetResponses = function (responses) { return false; }; ; Object.defineProperty(Mediator.prototype, "openData", { /** * 异步获取开启数据 * * @readonly * @type {Promise<OD>} * @memberof Mediator */ get: function () { return this._openPromiseData[0]; }, enumerable: true, configurable: true }); /** * 打开,为了实现IOpenClose接口 * * @param {OD} [data] 开启数据 * @param {...any[]} args 其他数据 * @returns {Promise<any>} 异步返回onOpen时返回的参数 * @memberof Mediator */ Mediator.prototype.open = function (data) { var _this = this; var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } // 判断状态 if (this._status !== MediatorStatus.UNOPEN) { return this.openData; } else { return new Promise(function (resolve, reject) { // 修改状态 _this._status = MediatorStatus.OPENING; // 赋值参数 _this.data = data; // 记一个是否需要遮罩的flag var maskFlag = _this.openMask; // 发送初始化消息 _this.sendInitRequests(function (err) { if (err) { // 移除遮罩 hideMask(); // 调用回调 _this.moduleOpenHandler && _this.moduleOpenHandler(ModuleOpenStatus.Stop, err); // 调用reject reject(err); _this._openPromiseData[2](err); } else { // 加载所有已托管中介者的资源 _this.loadAssets(function (err) { if (err) { // 移除遮罩 hideMask(); // 调用回调 _this.moduleOpenHandler && _this.moduleOpenHandler(ModuleOpenStatus.Stop, err); // 调用reject reject(err); _this._openPromiseData[2](err); } else { // 加载css文件 _this.loadStyleFiles(function (err) { if (err) { // 移除遮罩 hideMask(); // 调用回调 _this.moduleOpenHandler && _this.moduleOpenHandler(ModuleOpenStatus.Stop, err); // 调用reject reject(err); _this._openPromiseData[2](err); } else { // 加载js文件 _this.loadJsFiles(function (err) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var result, subOpenPromises, _i, _a, mediator, err_1; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: // 移除遮罩 hideMask(); if (!err) return [3 /*break*/, 1]; // 调用回调 this.moduleOpenHandler && this.moduleOpenHandler(ModuleOpenStatus.Stop, err); // 调用reject reject(err); this._openPromiseData[2](err); return [3 /*break*/, 7]; case 1: _b.trys.push([1, 6, , 7]); // 要先开启自身,再开启子中介者 // 调用回调 this.moduleOpenHandler && this.moduleOpenHandler(ModuleOpenStatus.BeforeOpen); // 调用模板方法 return [4 /*yield*/, this.__beforeOnOpen.apply(this, [data].concat(args))]; case 2: // 调用模板方法 _b.sent(); return [4 /*yield*/, this.onOpen.apply(this, [data].concat(args))]; case 3: result = _b.sent(); if (result !== undefined) this.data = data = result; // 初始化绑定,如果子类并没有在onOpen中设置viewModel,则给一个默认值以启动绑定功能 if (!this._viewModel) this.viewModel = {}; subOpenPromises = []; for (_i = 0, _a = this._children; _i < _a.length; _i++) { mediator = _a[_i]; subOpenPromises.push(mediator.open(data)); } // 等待子中介者开启完毕 return [4 /*yield*/, Promise.all(subOpenPromises)]; case 4: // 等待子中介者开启完毕 _b.sent(); // 修改状态 this._status = MediatorStatus.OPENED; // 调用模板方法 return [4 /*yield*/, this.__afterOnOpen.apply(this, [data].concat(args))]; case 5: // 调用模板方法 _b.sent(); // 调用回调 this.moduleOpenHandler && this.moduleOpenHandler(ModuleOpenStatus.AfterOpen); // 派发事件 this.dispatch(MediatorMessage.MEDIATOR_OPENED, this); // 调用resolve resolve(this.data); this._openPromiseData[1](this.data); return [3 /*break*/, 7]; case 6: err_1 = _b.sent(); reject(err_1); this._openPromiseData[2](err_1); return [3 /*break*/, 7]; case 7: return [2 /*return*/]; } }); }); }); } }); } }); } }); // 显示Loading if (maskFlag) { maskManager.showLoading(null, "mediatorOpen"); maskFlag = false; } function hideMask() { // 隐藏Loading if (!maskFlag) maskManager.hideLoading("mediatorOpen"); maskFlag = false; } }); } }; Mediator.prototype.__beforeOnOpen = function (data) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } // 给子类用的模板方法 }; Mediator.prototype.__afterOnOpen = function (data) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } // 给子类用的模板方法 }; Object.defineProperty(Mediator.prototype, "closeData", { /** * 异步获取关闭参数 * * @readonly * @type {Promise<CD>} * @memberof Mediator */ get: function () { return this._closePromiseData[0]; }, enumerable: true, configurable: true }); /** * 关闭,为了实现IOpenClose接口 * * @param {CD} [data] 关闭数据 * @param {...any[]} args 其他参数 * @returns {Promise<any>} 异步返回onClose时返回的参数 * @memberof Mediator */ Mediator.prototype.close = function (data) { var _this = this; var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } return new Promise(function (resolve, reject) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var children, result, err_2; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (!(this._status === MediatorStatus.OPENED)) return [3 /*break*/, 6]; _a.label = 1; case 1: _a.trys.push([1, 4, , 5]); this._closeData = data; children = this._children.concat(); return [4 /*yield*/, Promise.all(children.map(function (child) { return child.close(); }))]; case 2: _a.sent(); // 关闭自身 // 调用模板方法 this.__beforeOnClose.apply(this, [data].concat(args)); // 修改状态 this._status = MediatorStatus.CLOSING; return [4 /*yield*/, this.onClose.apply(this, [data].concat(args))]; case 3: result = _a.sent(); if (result) { this._closeData = result; } // 修改状态 this._status = MediatorStatus.CLOSED; // 调用模板方法 this.__afterOnClose.apply(this, [data].concat(args)); // 调用resolve resolve(this._closeData); // 调用cache中的resolve this._closePromiseData[1](this._closeData); return [3 /*break*/, 5]; case 4: err_2 = _a.sent(); reject(err_2); // 调用cache中的reject this._closePromiseData[2](err_2); return [3 /*break*/, 5]; case 5: return [3 /*break*/, 7]; case 6: if (this._status < MediatorStatus.CLOSED) { // 还没开启呢,等待Promise this._closePromiseData[0].then(resolve).catch(reject); } else { // 已经关闭过了,直接resolve resolve(this._closeData); } _a.label = 7; case 7: return [2 /*return*/]; } }); }); }); }; Mediator.prototype.__beforeOnClose = function (data) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } // 给子类用的模板方法 }; Mediator.prototype.__afterOnClose = function (data) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } // 派发关闭事件 this.dispatch(MediatorMessage.MEDIATOR_CLOSED, this); }; /** * 当打开时调用 * * @param {OD} [data] 可能的打开参数 * @param {...any[]} args 其他参数 * @returns {any|Promise<any>} 若返回对象则使用该对象替换传入的data进行后续开启操作 * @memberof Mediator */ Mediator.prototype.onOpen = function (data) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } // 可重写 }; /** * 当关闭时调用 * * @param {CD} [data] 可能的关闭参数 * @param {...any[]} args 其他参数 * @returns {any|Promise<any>} 若返回对象则使用该对象当做close操作的返回值 * @memberof Mediator */ Mediator.prototype.onClose = function (data) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } // 可重写 }; /** * 监听事件,从这个方法监听的事件会在中介者销毁时被自动移除监听 * * @param {S} target 事件目标对象 * @param {string} type 事件类型 * @param {Function} handler 事件处理函数 * @param {*} [thisArg] this指向对象 * @memberof Mediator */ Mediator.prototype.mapListener = function (target, type, handler, thisArg) { for (var i = 0, len = this._listeners.length; i < len; i++) { var data = this._listeners[i]; if (data.target == target && data.type == type && data.handler == handler && data.thisArg == thisArg) { // 已经存在一样的监听,不再监听 return; } } // 记录监听 this._listeners.push({ target: target, type: type, handler: handler, thisArg: thisArg }); // 调用桥接口 this.bridge.mapListener(target, type, handler, thisArg); }; /** * 注销监听事件 * * @param {S} target 事件目标对象 * @param {string} type 事件类型 * @param {Function} handler 事件处理函数 * @param {*} [thisArg] this指向对象 * @memberof Mediator */ Mediator.prototype.unmapListener = function (target, type, handler, thisArg) { for (var i = 0, len = this._listeners.length; i < len; i++) { var data = this._listeners[i]; if (data.target == target && data.type == type && data.handler == handler && data.thisArg == thisArg) { // 调用桥接口 this.bridge.unmapListener(target, type, handler, thisArg); // 移除记录 this._listeners.splice(i, 1); break; } } }; /** * 注销所有注册在当前中介者上的事件监听 * * @memberof Mediator */ Mediator.prototype.unmapAllListeners = function () { for (var i = 0, len = this._listeners.length; i < len; i++) { var data = this._listeners.pop(); // 调用桥接口 this.bridge.unmapListener(data.target, data.type, data.handler, data.thisArg); } }; Mediator.prototype.disposeChild = function (mediator, oriDispose) { // 调用原始销毁方法 oriDispose.call(mediator); // 取消托管 this.undelegateMediator(mediator); }; ; Object.defineProperty(Mediator.prototype, "root", { /** * 获取根级中介者(当做模块直接被打开的中介者) * * @type {IMediator} * @memberof IMediator */ get: function () { return (this.parent ? this.parent.root : this); }, enumerable: true, configurable: true }); Object.defineProperty(Mediator.prototype, "children", { /** * 获取所有子中介者 * * @type {IMediator[]} * @memberof Mediator */ get: function () { return this._children; }, enumerable: true, configurable: true }); /** * 托管子中介者 * * @param {IMediator} mediator 要托管的中介者 * @memberof Mediator */ Mediator.prototype.delegateMediator = function (mediator) { if (this._children.indexOf(mediator) < 0) { // 如果已有父级,先移除关系 if (mediator.parent) { mediator.parent.undelegateMediator(mediator); } // 托管新的中介者 this._children.push(mediator); // 设置关系 mediator.parent = this; // 设置observable关系 mediator.observable.parent = this._observable; // 篡改dispose方法,以监听其dispose if (mediator.hasOwnProperty("dispose")) this._disposeDict.set(mediator, mediator.dispose); mediator.dispose = this.disposeChild.bind(this, mediator, mediator.dispose); } }; /** * 取消托管子中介者 * * @param {IMediator} mediator 要取消托管的中介者 * @memberof Mediator */ Mediator.prototype.undelegateMediator = function (mediator) { var index = this._children.indexOf(mediator); if (index >= 0) { // 取消托管中介者 this._children.splice(index, 1); // 移除关系 mediator.parent = null; // 移除observable关系 if (mediator.observable) mediator.observable.parent = null; // 恢复dispose方法,取消监听dispose var oriDispose = this._disposeDict.get(mediator); if (oriDispose) mediator.dispose = oriDispose; else delete mediator.dispose; this._disposeDict.delete(mediator); } }; /** * 判断指定中介者是否包含在该中介者里(判断范围包括当前中介者和子孙级中介者) * * @param {IMediator} mediator 要判断的中介者 * @returns {boolean} * @memberof Mediator */ Mediator.prototype.containsMediator = function (mediator) { // 首先判断自身 if (mediator === this) return true; // 判断子中介者 var contains = false; for (var _i = 0, _a = this._children; _i < _a.length; _i++) { var child = _a[_i]; if (child.containsMediator(mediator)) { contains = true; break; } } return contains; }; /** * 托管ICancelable实例 * * @author Raykid * @date 2019-05-13 * @param {ICancelable} cancelable * @memberof Mediator */ Mediator.prototype.delegateCancelable = function (cancelable) { if (!~this._cancelables.indexOf(cancelable)) { this._cancelables.push(cancelable); } }; /** * 取消托管ICancelable实例 * * @author Raykid * @date 2019-05-13 * @param {ICancelable} cancelable * @memberof Mediator */ Mediator.prototype.undelegateCancelable = function (cancelable) { var index = this._cancelables.indexOf(cancelable); if (~index) { this._cancelables.splice(index, 1); } }; Mediator.prototype.cancelAll = function () { while (this._cancelables.length > 0) { this._cancelables.pop().cancel(); } }; /** * 其他模块被关闭回到当前模块时调用 * * @param {(IMediator|undefined)} from 从哪个模块回到当前模块 * @param {*} [data] 可能的参数传递 * @memberof Mediator */ Mediator.prototype.wakeUp = function (from, data) { // 调用自身方法 this.onWakeUp(from, data); // 递归调用子中介者方法 for (var _i = 0, _a = this._children; _i < _a.length; _i++) { var mediator = _a[_i]; mediator.onWakeUp(from, data); } }; /** * 模块切换到前台时调用(与wakeUp的区别是open时activate会触发,但wakeUp不会) * * @param {(IMediator|undefined)} from 从哪个模块来到当前模块 * @param {*} [data] 可能的参数传递 * @memberof Mediator */ Mediator.prototype.activate = function (from, data) { // 调用自身方法 this.onActivate(from, data); // 递归调用子中介者方法 for (var _i = 0, _a = this._children; _i < _a.length; _i++) { var mediator = _a[_i]; mediator.onActivate(from, data); } }; /** * 模块切换到后台时调用(close之后或者其他模块打开时) * * @param {(IMediator|undefined)} to 将要去往哪个模块 * @param {*} [data] 可能的参数传递 * @memberof Mediator */ Mediator.prototype.deactivate = function (to, data) { // 调用自身方法 this.onDeactivate(to, data); // 递归调用子中介者方法 for (var _i = 0, _a = this._children; _i < _a.length; _i++) { var mediator = _a[_i]; mediator.onDeactivate(to, data); } }; /** * 列出中介者所需的资源数组,可重写 * * @returns {string[]} * @memberof Mediator */ Mediator.prototype.listAssets = function () { return null; }; /** * 列出所需CSS资源URL,可重写 * * @returns {string[]} * @memberof Mediator */ Mediator.prototype.listStyleFiles = function () { return null; }; /** * 列出所需JS资源URL,可重写 * * @returns {JSFile[]} * @memberof Mediator */ Mediator.prototype.listJsFiles = function () { return null; }; /** * 列出模块初始化请求,可重写 * * @returns {RequestData[]} * @memberof Mediator */ Mediator.prototype.listInitRequests = function () { return null; }; /** * 其他模块被关闭回到当前模块时调用 * * @param {(IMediator|undefined)} from 从哪个模块回到当前模块 * @param {*} [data] 可能的参数传递 * @memberof Mediator */ Mediator.prototype.onWakeUp = function (from, data) { // 可重写 }; /** * 模块切换到前台时调用(与onWakeUp的区别是open时onActivate会触发,但onWakeUp不会) * * @param {(IMediator|undefined)} from 从哪个模块来到当前模块 * @param {*} [data] 可能的参数传递 * @memberof Mediator */ Mediator.prototype.onActivate = function (from, data) { // 可重写 }; /** * 模块切换到后台时调用(close之后或者其他模块打开时) * * @param {(IMediator|undefined)} to 将要去往哪个模块 * @param {*} [data] 可能的参数传递 * @memberof Mediator */ Mediator.prototype.onDeactivate = function (to, data) { // 可重写 }; Object.defineProperty(Mediator.prototype, "observable", { /** * 暴露IObservable * * @readonly * @type {IObservable} * @memberof Mediator */ get: function () { return this._observable; }, enumerable: true, configurable: true }); /** dispatch方法实现 */ Mediator.prototype.dispatch = function () { var params = []; for (var _i = 0; _i < arguments.length; _i++) { params[_i] = arguments[_i]; } this._observable.dispatch.apply(this._observable, params); }; /** * 监听消息 * * @param {string} type 消息类型 * @param {Function} handler 消息处理函数 * @param {*} [thisArg] 消息this指向 * @param {boolean} [once=false] 是否是一次性监听 * @memberof Mediator */ Mediator.prototype.listen = function (type, handler, thisArg, once) { if (once === void 0) { once = false; } this._observable.listen(type, handler, thisArg, once); }; /** * 移除消息监听 * * @param {string} type 消息类型 * @param {Function} handler 消息处理函数 * @param {*} [thisArg] 消息this指向 * @param {boolean} [once=false] 是否是一次性监听 * @memberof Mediator */ Mediator.prototype.unlisten = function (type, handler, thisArg, once) { if (once === void 0) { once = false; } this._observable.unlisten(type, handler, thisArg, once); }; /** * 注册命令到特定消息类型上,当这个类型的消息派发到框架内核时会触发Command运行 * * @param {string} type 要注册的消息类型 * @param {(ICommandConstructor)} cmd 命令处理器,可以是方法形式,也可以使类形式 * @memberof Mediator */ Mediator.prototype.mapCommand = function (type, cmd) { this._observable.mapCommand(type, cmd); }; /** * 注销命令 * * @param {string} type 要注销的消息类型 * @param {(ICommandConstructor)} cmd 命令处理器 * @returns {void} * @memberof Mediator */ Mediator.prototype.unmapCommand = function (type, cmd) { this._observable.unmapCommand(type, cmd); }; /** * 销毁中介者 * * @memberof Mediator */ Mediator.prototype.dispose = function () { var _this = this; // 判断状态 if (this.status >= MediatorStatus.DISPOSING) return; // 修改状态 this._status = MediatorStatus.DISPOSING; // 移除绑定 bindManager.unbind(this); // 注销事件监听 this.unmapAllListeners(); // 调用模板方法 this.onDispose(); // 移除显示,只移除没有原始皮肤的,因为如果有原始皮肤,其原始parent可能不希望子节点被移除 if (!this.oriSkin) { if (this.skin && this.bridge) { var parent = this.bridge.getParent(this.skin); if (parent) this.bridge.removeChild(parent, this.skin); } } // 移除表现层桥 this.bridge = null; // 移除ViewModel unmutate(this._viewModel); this._viewModel = null; // 移除绑定目标数组 this.bindTargets = null; // 移除数据 this.data = null; // 移除皮肤 this.skin = null; this.oriSkin = null; // 移除父引用 this.parent = null; // 移除其他无用对象 this.moduleOpenHandler = null; // 将所有子中介者销毁 var children = this._children.concat(); for (var _i = 0, children_1 = children; _i < children_1.length; _i++) { var child = children_1[_i]; child.dispose(); } this._children = null; // 取消所有已托管的ICancelable this.cancelAll(); this._cancelables = null; // 将observable的销毁拖延到下一帧,因为虽然执行了销毁,但有可能这之后还会使用observable发送消息 system.nextFrame(function () { // 移除observable _this._observable.dispose(); _this._observable = null; // 修改状态 _this._status = MediatorStatus.DISPOSED; }); }; /** * 当销毁时调用 * * @memberof Mediator */ Mediator.prototype.onDispose = function () { // 可重写 }; return Mediator; }()); export default Mediator;