任务面板首次打开时截止控件没升级成 AntD (#75)

用户:「空间有了,但是不是我想要的空间,这个空间需要换。」
经确认「空间」=「控件」,现象是五个原生下拉(年/月/日/时/分),
期望 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 运行时注入),
不存在"缺样式导致看起来像原生下拉"的可能。
This commit is contained in:
2026-11-05 17:59:17 +08:00
parent 836f6f1d2f
commit 7a108396ab
2 changed files with 34 additions and 0 deletions
+22
View File
@@ -208,6 +208,28 @@
if (!bodyEl() || html.indexOf('data-tk-panel') < 0) { throw new Error('panel'); } if (!bodyEl() || html.indexOf('data-tk-panel') < 0) { throw new Error('panel'); }
bodyEl().innerHTML = html; bodyEl().innerHTML = html;
runInlineScripts(bodyEl(), 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 () { .catch(function () {
if (!bodyEl()) { return; } if (!bodyEl()) { return; }
+12
View File
@@ -405,4 +405,16 @@
} }
step(); step();
} }
/**
* 对外暴露「给截止控件绑 change 监听」(#74)。
*
* 为什么需要:首次打开面板走的是 `entry_popup.js` 的 `loadPanel()`,
* 那条路只 innerHTML、不经过本文件的 `paint()` ⇒ `bindDue()` 不会自动跑
* ⇒ 用户选完截止时间不会保存(只有做过一次别的动作、触发过一次重画才会生效)。
* `loadPanel()` 在插入 HTML 后显式调这个。
*
* ⚠️ 内部有 `data-fb-due-bound` 幂等标记,重复调用不会重复绑。
*/
window.fbTaskPanelBindDue = bindDue;
})(); })();