diff --git a/apps/api/src/modules/interaction/__tests__/view-render.test.ts b/apps/api/src/modules/interaction/__tests__/view-render.test.ts index cdf1888..af90cc3 100644 --- a/apps/api/src/modules/interaction/__tests__/view-render.test.ts +++ b/apps/api/src/modules/interaction/__tests__/view-render.test.ts @@ -477,4 +477,33 @@ describe('data-options:下拉的选项从台账现读', () => { expect(out.match(/'); + }); }); diff --git a/apps/api/src/modules/interaction/internal/domain/view-render.ts b/apps/api/src/modules/interaction/internal/domain/view-render.ts index 1ca7cd2..4a0087e 100644 --- a/apps/api/src/modules/interaction/internal/domain/view-render.ts +++ b/apps/api/src/modules/interaction/internal/domain/view-render.ts @@ -272,6 +272,28 @@ function twinInputs(inner: string, rowIndex: number): string { /** 手写的下拉孪生件:`` */ const SELECT_CELL = /]*\bdata-col\s*=\s*"([^"]+)"[^>]*>[\s\S]*?<\/select>/g; +/** + * **收尾防重的记号**(2026-08-29,评审逮到:「有没有 `selected` 这个词」防不住重复处理)。 + * + * `renderRows` 逐行展开时用**这一行自己的作用域**先调一遍 `selectCurrent`;`renderView` + * 收尾时还会再拿**外层作用域**兜底调一遍,专为处理那些根本不在任何 `data-rows` 里的下拉 + * (见 `selectCurrent` 的文档注释)。两次谁先谁后要能分清「这块处理过没有」—— + * **不能拿「块里有没有 `selected` 这个词」当代理**:一行被正确处理过、且合法地落在 + * 「没有选中项」上(这一行的值不在选项里,或这一格还没填),跟「压根没被处理过」在字面上 + * 是同一个样子,都没有这个词。若外层作用域里恰好有一个同名的裸键、且它的值命中了某个选项 + * (「行内 `chip_type_id` 与外层同名」这种情况在这仓的用法下并不罕见),收尾那一遍会把它 + * **错误地** 渗进这一行 —— 界面撒了谎:下拉显示一个这一行的数据里根本不存在的选中态, + * 值是从一个无关字段借来的。这个词也可能出现在 `