diff --git a/bricks/jsoncall.js b/bricks/jsoncall.js index 6e9e2c0..162acb1 100644 --- a/bricks/jsoncall.js +++ b/bricks/jsoncall.js @@ -168,6 +168,14 @@ bricks.HttpText = class { return result; } async withLoginInfo(url, opts){ + // 登录窗单例(2026-09-08):手机首屏并发多个 401 请求时,旧实现每个请求 + // 各建一个登录窗 → 叠开多个登录页。共享同一个窗:后来者等它销毁后重试。 + if (bricks._login_window_pending){ + await new Promise(resolve => { + bricks._login_window_pending.bind('destroy', resolve); + }); + return await this._retry_after_login(url, opts); + } var login_window = await bricks.widgetBuild({ "widgettype":"urlwidget", "options":{ @@ -182,12 +190,16 @@ bricks.HttpText = class { console.log('withLoginInfo: failed to build login widget'); return null; } + bricks._login_window_pending = login_window; // Wait for login window to be destroyed (successful login) await new Promise(resolve => { login_window.bind('destroy', resolve); }); - + bricks._login_window_pending = null; + return await this._retry_after_login(url, opts); + } + async _retry_after_login(url, opts){ console.log('withLoginInfo: login window destroyed, retrying request'); // Retry the original request diff --git a/bricks/tab.js b/bricks/tab.js index 87ca925..3e24ef1 100644 --- a/bricks/tab.js +++ b/bricks/tab.js @@ -104,6 +104,10 @@ bricks.TabPanel = class extends bricks.Layout { this._mobile_bar_apply(bricks.is_mobile()); } _mobile_bar_clicked(item){ + // bind 事件经 dispatch 包装为 {params: 数据}(Toolbar/Menu 同约定); + // 框架内部直调传裸对象 —— 两种形态都兼容(2026-09-08 实测:不解包则 + // 用户点底部 Tab 静默无响应) + if (item && item.params) item = item.params; var desc = null; for (var i=0;i