lowcode-engine
lowcode-engine copied to clipboard
ExpressionSetter 替换为 VariableSetter 的所有 bug 汇总
当前 ExpressionSetter 有很多遗留问题,相比 VariableSetter,它的展现面积小,可扩展性低。
它仅仅作为 MixedSetter 内包含 ArraySetter 和 ObjectSetter 时的一个 fallback 使用。这部分适配逻辑见 MixedSetter:
const hasComplexSetter = formattedSetters.filter((item) =>
['ArraySetter', 'ObjectSetter'].includes(item.setter),
).length;
return formattedSetters.map((item) => {
if (item.setter === 'VariableSetter' && hasComplexSetter) {
item.setter = 'ExpressionSetter';
item.name = 'ExpressionSetter';
}
return item;
});
如果解决了下述问题,ExpressionSetter 即可完全替换为 VariableSetter
ObjectSetter / ArraySetter 能绑定 PluginVariableBindDialog 的值,但 blur 后重新 focus 无法正确回显
(这里有个 gif)
(这里有个 gif)
参考信息引擎内部版本 bug,表现应该跟 3 一致:
- ArraySetter 会 setValue 导致覆盖 VariableSetter > PluginVariableBindDialog 的值,导致无法设置 Schema 成功 通过注释发现,每个 item 上都会 createSettingFieldView,返回的 SettingFieldView 内部的 onChange 会被触发,导致覆盖之前的设置。
- 通过注释 ArraySetter 上的 item 代码绕过1,可以发现 Schema 设置后无法正确回显状态,再次打开浮层也拿不到之前的绑定值。 引擎的
field.isUseVariable()
判定有误,ArraySetter + VariableSetter 会将 mock 值设置为之前的值,getValue 时得到 mock 值从而判定异常。- ObjectSetter 的值能绑定到 Schema,能正确回显,但触发 blur 后再次 focus,绑定值回退到之前的状态。 这个问题类似 1,createSettingFieldView 导致的覆盖。只是 ObjectSetter 的更新频次没有 ArraySetter 那么勤,所以表现得跟 1 不一样。
当VariableSetter和ArraySetter或者ObjectSetter一起使用时,会被强制转换成ExpressionSetter。想了解下为啥这么设计,有什么坑吗?变量比较好用,变量和ObjectSetter、ArraySetter一起使用的场景还蛮多的。对应地址:https://github.com/alibaba/lowcode-engine-ext/blame/main/src/setter/mixed-setter/index.tsx#L134
@zhaoruilinda
主要还是兼容性问题哈,这块应该转化为 VariableSetter 的,毕竟打开一个浮层,引用 monaco-editor 的可扩展性是最高的。但是现在有些切换和组合逻辑有 bug
这块目前直接使用VariableSetter会涉及很多子功能、嵌套的变量 不可用的问题,如果要修改的话,需要花一些时间重构下代码,所以目前暂时用ExpressionSetter来保证初级的功能可用
@hzd822 这一块功能应该还是很常见的,想问下这里大概什么时间点能支持呢