From 7a108396abf23b62e0dd78870abc2670316c9881 Mon Sep 17 00:00:00 2001 From: laoyang Date: Thu, 5 Nov 2026 17:59:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E9=9D=A2=E6=9D=BF=E9=A6=96?= =?UTF-8?q?=E6=AC=A1=E6=89=93=E5=BC=80=E6=97=B6=E6=88=AA=E6=AD=A2=E6=8E=A7?= =?UTF-8?q?=E4=BB=B6=E6=B2=A1=E5=8D=87=E7=BA=A7=E6=88=90=20AntD=20(#75)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户:「空间有了,但是不是我想要的空间,这个空间需要换。」 经确认「空间」=「控件」,现象是五个原生下拉(年/月/日/时/分), 期望 AntD 弹层日历。 真根因:首次打开面板走 entry_popup.js 的 loadPanel(), 它只 innerHTML + runInlineScripts,**没有补挂 AntD**。 上一条 #74 我在 task_panel.js 的 paint() 里加了 fbBootAntd(), 但 paint() 只在"面板里做了动作之后重画"时才跑 (点状态/挪看板/加子任务/发评论/传附件 → act() → 回来 paint())。 **首次打开不经过 paint()** ⇒ 用户第一眼看到的是从未升级过的原生下拉。 (先点一下「已完成」再点回来就会看到 AntD 挂上了 —— 这种"时好时坏"最迷惑。) 为什么 bootAntd 首屏也没兜住: if (!hosts.length && !dateRanges.length && !dates.length && !singles.length) return; 首页首屏任务卡里没有 [data-dt-antd-single](那控件要打开面板才有) ⇒ 首屏调用时直接 return。 修法: ① entry_popup.js loadPanel():插入 HTML 后调 fbBootAntd() ② 顺带修第二个 bug:bindDue() 原来也只在 paint() 里调, 首次打开不绑定 ⇒ 选完截止时间 change 没人听 ⇒ **不会保存**。 ⇒ 把 bindDue 暴露成 window.fbTaskPanelBindDue,loadPanel 显式调一次。 加载顺序已确认:两者都是 defer,entry_popup.js(253) 在前、 task_panel.js(268) 在后 ⇒ task_panel 先执行完并注册好 window.fbTaskPanelBindDue,之后 loadPanel 才在用户点击时调用。 不存在"调的时候还没定义"。 antd 样式确认:vendor 目录只有 reset.css(antd 5 是 CSS-in-JS 运行时注入), 不存在"缺样式导致看起来像原生下拉"的可能。 --- assets/js/entry_popup.js | 22 ++++++++++++++++++++++ assets/js/task_panel.js | 12 ++++++++++++ 2 files changed, 34 insertions(+) diff --git a/assets/js/entry_popup.js b/assets/js/entry_popup.js index 73b9603..2ab115a 100644 --- a/assets/js/entry_popup.js +++ b/assets/js/entry_popup.js @@ -208,6 +208,28 @@ if (!bodyEl() || html.indexOf('data-tk-panel') < 0) { throw new Error('panel'); } bodyEl().innerHTML = html; runInlineScripts(bodyEl(), html); + /* 🔴🔴 #74(用户 2026-11-05):「空间有了,但是不是我想要的空间,这个空间需要换。」 + —— 实为「控件」:面板里的截止时间显示成**五个原生下拉**(年/月/日/时/分), + 而不是 AntD 的弹层日历。 + + 真根因:**首次打开面板走的是这条 loadPanel()**,它只 innerHTML + 跑内联脚本, + **没有补挂 AntD**。 + 我在 task_panel.js 的 paint() 里加过 fbBootAntd(),但那只管 + "面板里做了动作之后的重画"——**首次打开不经过 paint()**。 + ⇒ 用户点开任务看到的是从未被升级过的原生下拉。 + + ⚠️ 与上面 loadEdit() 里那次调用同一个理由:AJAX 换进来的 HTML + 不会自己跑初始化;bootAntd() 只在页面加载时扫过一次 + [data-dt-antd-single],那时面板还不存在。 + ⚠️ 放在 runInlineScripts 之后:内联脚本里可能也有初始化逻辑, + 让它先跑完;mountAntd* 有 data-antd-done 幂等标记,重复调用无害。 */ + if (typeof window.fbBootAntd === 'function') { + try { window.fbBootAntd(); } catch (e) { /* 挂不上就留在原生下拉,不阻断面板 */ } + } + /* 截止控件的 change 监听(#74):首次打开也要绑,否则选完时间不会保存 */ + if (typeof window.fbTaskPanelBindDue === 'function') { + try { window.fbTaskPanelBindDue(); } catch (e) { /* 忽略 */ } + } }) .catch(function () { if (!bodyEl()) { return; } diff --git a/assets/js/task_panel.js b/assets/js/task_panel.js index c36389b..cddd0dd 100644 --- a/assets/js/task_panel.js +++ b/assets/js/task_panel.js @@ -405,4 +405,16 @@ } step(); } + + /** + * 对外暴露「给截止控件绑 change 监听」(#74)。 + * + * 为什么需要:首次打开面板走的是 `entry_popup.js` 的 `loadPanel()`, + * 那条路只 innerHTML、不经过本文件的 `paint()` ⇒ `bindDue()` 不会自动跑 + * ⇒ 用户选完截止时间不会保存(只有做过一次别的动作、触发过一次重画才会生效)。 + * `loadPanel()` 在插入 HTML 后显式调这个。 + * + * ⚠️ 内部有 `data-fb-due-bound` 幂等标记,重复调用不会重复绑。 + */ + window.fbTaskPanelBindDue = bindDue; })();