|
|
@@ -3031,3 +3031,30 @@ F073 把整篇综合说明当正文流式铺满后,卡片照旧排在正文之
|
|
|
- 断言新增 2 项(引导语存在、且排在图片之前)——适配层脚本 25 → **27/27 通过**
|
|
|
- 文案做成导出的常量 `CIPA_QRCODE_TIP`(要改文案只动一处)
|
|
|
- 同步:`api-chat.md` 的 cipa 节、`feature_list.json` 的 `cipa-qrcode`
|
|
|
+
|
|
|
+### 续 3:修一个真 bug —— 「整块重写」时渲染层把新内容的中段当正文显示
|
|
|
+
|
|
|
+**用户报告**:界面上直接显示出一大段参考资料 JSON(`{"title":"食品经营许可…","publisher":"",…}`)。
|
|
|
+
|
|
|
+**根因(两处叠加,都是我引入的)**:
|
|
|
+1. `BusinessRecord` 的内容 watch 只有**增量**路径:`diffText = val.slice(count.value)`
|
|
|
+ —— 它假设 content 只会往后追加。而我在流式收尾用 `ai.content = ''` + 再赋值做**整块重写**
|
|
|
+ (卡片重排/answer_end 重建/撤草稿),切出来的正是新内容的**中段** → 中段被当正文渲染。
|
|
|
+2. 那个「先清空再赋值」的写法**根本不生效**:Vue 的 watcher 默认 pre-flush,
|
|
|
+ 同步两次赋值会被**合并成一次回调**,中间的空值看不到 → 清空动作从未发生。
|
|
|
+
|
|
|
+**修法**(渲染层补能力 + 调用方简化):
|
|
|
+- `BusinessRecord` 的内容 watch 增加**非纯追加**分支:`!val.startsWith(originContent)` →
|
|
|
+ `resetDisplayContent()` + `xmlFilter.reset()`(解析器也有状态:buffer/未闭合标签),再全量解析。
|
|
|
+ 纯追加(流式 delta、answer_end 尾缀补齐)仍走增量路径,不重置、不闪。
|
|
|
+- `resetDisplayContent()` 顺带清 **scope 退场补偿态**(`scopeExitHeight/Width`、`recordHeightLock`
|
|
|
+ 与定时器)—— `isScopeExitCompensating` 为真时**正文行是隐藏的**,残留会让重写后的正文整段不显示
|
|
|
+ (这是同一类潜在 bug)
|
|
|
+- hook 里三处「先清空再赋值」简化为**单次整块赋值**(渲染层现在能识别重写),并注释说明为什么不要两步
|
|
|
+
|
|
|
+**顺带修好的**:`answer_end` 的整块重建、**撤草稿**两条路径此前依赖同一个失效的清空动作
|
|
|
+(草稿行不会被撤掉)——现在都走新的重置分支了。
|
|
|
+
|
|
|
+**验证**:新增 1 项契约断言(compose 后的内容**不是**正文的纯追加 → 渲染层必须支持整块重写);
|
|
|
+适配层 27/27、流式 88/88、聊天任务 33/33、判空口径 30/30 全绿;`npm run build` 通过。
|
|
|
+⚠️ 渲染层行为只能在浏览器确认(harness 不跑 Vue 组件)——请刷新后再看一次。
|