修:点已有纪念日编辑时关联人一片空白 (#91b)

用户 2026-11-05:「刚才关联人还有1人呢,现在关联人怎么没了?是个空的。」

真根因(两层,缺一个都不会有这现象):

① `dayRoster` 只在 `openDayCreate()`(**新建**入口)里加载
   `openDayDetail()`(**点已有纪念日**)从不加载它 ⇒ roster 恒为空数组
   ⇒ 编辑框里按 id 查不到人。
   ⇒ 抽出 `ensureDayRoster()`,两个入口都调。
     `openDayDetail` 里**不 await**:先让卡片弹出来(点击要即时反馈),
     名册回来后 `@Param` 变化会自动重画 chips。

② `pickedPeople()` 是"查不到就 skip"
   roster 为空时返回 `[]` ⇒ chips 区什么都不画 ⇒ 看着像关联关系被清空了。
   而这数据其实一直在 `personIds` 里,保存也不会丢 ——
   典型的"查不到就静默丢弃",最吓人的那种:数据没坏,但界面像是坏了。
   ⇒ 新增 `pickedSlots()`:roster 里查不到**也产出占位项**
     (名字写「成员 #id」、known=false、灰色字),至少让人看到"关联了一个人"。
   ⇒ 判断分支改看 `personIds.length`(**事实**),
     而不是 `pickedPeople()`(可能因 roster 没到而为空)。

顺手删掉 `pickedPeople()`(改成 slots 后没人用了,712 字符)。

⚠️ 派生(生日)走只读卡不需要名册,但 `openDayDetail` 统一加载也无害
   (`ensureDayRoster` 有缓存判断,第二次直接返回)。

编译通过,已装真机。
This commit is contained in:
2026-11-05 20:53:53 +08:00
parent 4963a1b520
commit 5f8de01033
2 changed files with 108 additions and 30 deletions
+43 -11
View File
@@ -701,8 +701,19 @@ export struct FbHomePage {
}
/** 打开纪念日详情(#63)。 */
/**
* 打开纪念日详情(#63)。
*
* ⚠️ #91c:**必须先加载名册** —— 自建纪念日的编辑框要显示「关联人」
* (头像 + 名字)。原来这里不加载,roster 恒空 ⇒ 关联人区域空白。
* ⚠️ 派生(生日)走只读卡,不需要名册 —— 但这里统一加载也无害
* (一次调用,有缓存)。
*/
private openDayDetail(d: FbRecentDay): void {
this.dayDetail = d;
/* 不 await:先让卡片弹出来(用户点击要即时反馈),
名册回来后 `@Param` 变化会自动重画关联人 chips。 */
this.ensureDayRoster();
}
private closeDayDetail(): void {
@@ -940,21 +951,42 @@ export struct FbHomePage {
* 本地库由 `syncAll` 定期同步,所以第一次装机时可能为空 ——
* 那时仍然要能建(纪念日本身不依赖人)。
*/
/**
* 确保名册已加载(纪念日「关联人」要用)。
*
* 🔴🔴 #91c(用户 2026-11-05):「刚才关联人还有1人呢,现在关联人怎么没了?
* 是个空的。」
*
* **真根因**:这段加载原来**写在 `openDayCreate()` 里面** ——
* 也就是说只有"新建纪念日"会去拉名册;
* **点一条已有纪念日(`openDayDetail`)走的是另一条路,从不加载** ⇒
* `dayRoster` 恒为空数组 ⇒ 编辑框里按 id 查不到人 ⇒ 关联人区域一片空白。
*
* ⚠️ 数据没丢(`personIds` 一直是好的),只是**画不出来** ——
* 所以更吓人:看着像关联关系被清空了。
* ⚠️ 抽成独立方法,两个入口都调;`dayLoadingRoster` 防并发重复拉。
* ⚠️ 失败只记日志、不打断:纪念日本身不依赖人(名册为空也能建/能改)。
*/
private async ensureDayRoster(): Promise<void> {
if (this.dayRoster.length > 0 || this.dayLoadingRoster) {
return;
}
this.dayLoadingRoster = true;
try {
this.dayRoster = await FbPersonRepo.inst().list();
} catch (err) {
hilog.warn(DOMAIN, TAG, '首页拉名册失败(纪念日关联人):%{public}s', JSON.stringify(err));
this.dayRoster = [];
} finally {
this.dayLoadingRoster = false;
}
}
private async openDayCreate(): Promise<void> {
if (this.dayCreating) {
return;
}
if (this.dayRoster.length === 0 && !this.dayLoadingRoster) {
this.dayLoadingRoster = true;
try {
this.dayRoster = await FbPersonRepo.inst().list();
} catch (err) {
hilog.warn(DOMAIN, TAG, '首页拉名册失败(纪念日关联人):%{public}s', JSON.stringify(err));
this.dayRoster = [];
} finally {
this.dayLoadingRoster = false;
}
}
await this.ensureDayRoster();
this.dayCreating = true;
}