/** * BridgeCenterBase - 跨端通讯,通知接收基类 * @author Tevin */ import Taro from '@tarojs/taro'; import { $bridge } from '@components/common/Bridge'; import { Fetcher } from '@components/bases/Fetcher'; export class BridgeCenterBase { constructor(tellings) { this._init(tellings); } _init(tellings) { tellings.forEach(method => { const name = Fetcher.prototype.stringToCamel(method); // BridgeCenter 已注册,但没有定义接收器的协议,提示 if (typeof this[name] === 'undefined') { console.warn('BridgeTelling:协议【' + method + '】未发现对应接收器!'); } // BridgeCenter 已注册已定义接收器的协议,注册接收器 else { $bridge.register(method, (res, callback) => { this[name](method, res, callback); }); } }); } /** * 获取当前页面 * @return {Taro.Page} */ $getCurrentPage() { const pages = Taro.getCurrentPages(); return pages[pages.length - 1]; } /** * 获取当前页面路径 * @return {String} */ $getCurrentPagePath() { return this.$getCurrentPage().path.split('?')[0]; } /** * 判断地址是否为当前页面 * @param {String} url * @return {Taro.Page|null} */ $isCurrentPage(url) { const pages = Taro.getCurrentPages(); const curPage = pages[pages.length - 1]; if (curPage.path.split('?')[0] === url.split('?')[0]) { return curPage; } else { return null; } } /** * 判断当前页面是否在列表中 * @param {Array} allows=[] * @return {boolean} */ $isCurPageInside(allows = []) { const url = this.$getCurrentPagePath(); return allows.indexOf(url) >= 0; } _waitCurPage(url, callback) { let curPage = this.$isCurrentPage(url); if (curPage) { callback(curPage); } else { setTimeout(() => { this._waitCurPage(url, callback); }, 100); } } /** * 打开指定页面 * @param {String} url * @param {Function} callback */ $openPage(url, callback) { const curPage = this.$isCurrentPage(url); // 需打开的是当前页面 if (curPage) { callback(curPage); } else { Taro.navigateTo({ url }); setTimeout(() => { this._waitCurPage(url, callback); }, 100); } } /** * 当前页下发通讯 * @param {String} method * @param {Object} res * @param {Function} [callback] */ $curPageBridge(method, res, callback) { this.$pageBridge(this.$getCurrentPage(), method, res, callback); } /** * 对某个页面下发通知 * @param {Taro.Page} page * @param {String} method * @param {Object} res * @param {Function} [callback] */ $pageBridge(page, method, res, callback) { if (!page.$component || !page.$component.$onBridge) { return; } try { res = typeof res === 'string' ? JSON.parse(res) : res; } catch (e) {} page.$component.$onBridge(method, res, callback); } }