E3.13.2parent change clears or validates child设计

上级变更需要清空或校验下级已选的值

别名: 级联清空 · stale child value · 上级变更

概念解释

父级一改,子级里已经选定的值可能不再合法。系统必须立刻清空或重新校验(clear or revalidate):要么把子级打回空,要么确认旧值仍属于新父级的集合并留下,绝不能让一个不属于新父级的市名继续挂在触发器上。沉默留下的过期值会跟着表单提交,造成「省是江苏、市是杭州」这种内部矛盾。

清空是默认的安全动作;只有在旧值仍合法时才保留。保留必须经过校验,不是因为「用户填过所以珍惜」。

机制

子级值的合法性是相对于父级的。父级写入新值后,旧子值的参照系消失。界面若继续显示旧子值,用户会以为组合仍成立——触发器上的文字比模型约束更被信任。提交时服务端也许会拒,但拒在最后,用户要回溯整条链才能懂为什么。更糟的是服务端也没拒,脏组合进了库。

多级时,改顶层应像推倒骨牌:每一级都对直接父级重算。只清第二级、留下第三级,会出现「类目变了、型号还在」的断层。校验要沿着整条链走,不能只动相邻一级。

边界

旧值在新父级下碰巧同名但不是同一对象(两个省都有「朝阳区」)时,按字符串保留会绑错 ID,必须按标识符校验,同名也要清空或让用户重选。用户正在子级面板里浏览时父级被别处改写(自动定位、协作编辑),清空要可见,不能只在模型里默默抹掉。回填已保存的合法链时,不要当成「上级变更」去清掉——那是在恢复,不是在改父。深链上频繁改父会让用户的劳动一次次作废,可在清空前用一句「将重置下列选择」把代价说出来,但仍应清空,而不是为了珍惜劳动留下非法值。

怎么落地

  • 父值变化时,对每一级子值用新父集合做成员检验;不在集合里的立刻清空。
  • 清空要反映在触发器上,不要留下旧名配新父。
  • 多级连锁重置,并在即将丢掉已填内容时给一句预告。
  • 验证:选完整链,改顶层,看下游触发器。任何仍显示旧名且 ID 不属于新父的,就是漏了校验。

延伸

  • 同组E3.13.1 级联选择的下一级选项依赖上一级的选择结果 · E3.13.3 层级过多会使级联选择的操作路径过长 · E3.13.4 级联结构不适合需要跨层级比较的场景
  • 相邻E3.11 默认值策略 · E3.05 下拉选择器
  • 站内检索stale dependent value · cascade reset · revalidate child

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/E3.13.2