发现于 #4781 的实施,回传立单。又一处 #4768 / #4781 家族的「控件显示空、行却带着看不见的值」,这次成因是值域而不是类型。
事实
packages/components/src/custom/filter-builder.tsx(origin/main 65e88e6):带 options 的 select/lookup 列,其值控件是一个受控的 Select,value={String(condition.value || "")}。Radix 的 SelectValue 只认已挂载的 SelectItem,值不在 options 里就什么都不渲染 —— 与 #4768 里 operator trigger 显示空是同一个机制。
复现:筛选面板加一行 → 字段选文本列 → 值输入 acme → 字段改成一个 picklist 列(选项 won / lost)→ 值控件显示空,行里仍是 value: "acme",照样持久化、照样下发查询。
实测(jsdom):切换后 onChange 最后一次给出的行 value 为 "acme",值 trigger 的文本为空串。
#4781 已落的类型重整刻意不覆盖这一条:select/lookup 属于文本族,"acme" 在类型上是装得下的,被清掉的只有类型装不下的值。这里要答的是「值在不在该列的选项集里」,是值域问题。
定语义前要先答的
lookup 类字段的候选值可能是远程/异步的(LookupValuePicker 走远程搜索,options 常常为空或未到位)。照本地 options 一律清空,会把一个完全合法的 lookup id 清掉 —— 这个风险决定了不能照抄 #4781 的做法:
倾向 A + C 的组合(静态选项列清空,远程列显示为临时项),但这是公共行为,建议按 #4781 的路子交维护者裁定。
参考
发现于 #4781 的实施,回传立单。又一处 #4768 / #4781 家族的「控件显示空、行却带着看不见的值」,这次成因是值域而不是类型。
事实
packages/components/src/custom/filter-builder.tsx(origin/main65e88e6):带options的 select/lookup 列,其值控件是一个受控的 Select,value={String(condition.value || "")}。Radix 的 SelectValue 只认已挂载的 SelectItem,值不在options里就什么都不渲染 —— 与 #4768 里 operator trigger 显示空是同一个机制。复现:筛选面板加一行 → 字段选文本列 → 值输入
acme→ 字段改成一个 picklist 列(选项won/lost)→ 值控件显示空,行里仍是value: "acme",照样持久化、照样下发查询。实测(jsdom):切换后
onChange最后一次给出的行value为"acme",值 trigger 的文本为空串。与 #4781 的边界
#4781 已落的类型重整刻意不覆盖这一条:select/lookup 属于文本族,
"acme"在类型上是装得下的,被清掉的只有类型装不下的值。这里要答的是「值在不在该列的选项集里」,是值域问题。定语义前要先答的
lookup 类字段的候选值可能是远程/异步的(
LookupValuePicker走远程搜索,options常常为空或未到位)。照本地options一律清空,会把一个完全合法的 lookup id 清掉 —— 这个风险决定了不能照抄 #4781 的做法:倾向 A + C 的组合(静态选项列清空,远程列显示为临时项),但这是公共行为,建议按 #4781 的路子交维护者裁定。
参考