alibaba / alibaba/lowcode-engine
ExpressionSetter 替换为 VariableSetter 的所有 bug 汇总
- Dominant language
- TypeScript
- Stars
- 15.9k
- Forks
- 2.7k
- PR merge metrics
- No merged PRs in 30d
Description
当前 ExpressionSetter 有很多遗留问题,相比 VariableSetter,它的展现面积小,可扩展性低。

它仅仅作为 MixedSetter 内包含 ArraySetter 和 ObjectSetter 时的一个 fallback 使用。这部分适配逻辑见 MixedSetter:
```tsx
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](https://img.alicdn.com/imgextra/i1/O1CN01FSiub41I5DrHSvmqo_!!6000000000841-1-tps-640-331.gif))

([这里有个 gif](https://img.alicdn.com/imgextra/i2/O1CN01incPh422RdZJhmeWl_!!6000000007117-1-tps-640-331.gif))

> 参考信息引擎内部版本 bug,表现应该跟 3 一致:
> 1. ArraySetter 会 setValue 导致覆盖 VariableSetter > PluginVariableBindDialog 的值,导致无法设置 Schema 成功
通过注释发现,每个 item 上都会 createSettingFieldView,返回的 SettingFieldView 内部的 onChange 会被触发,导致覆盖之前的设置。
> 2. 通过注释 ArraySetter 上的 item 代码绕过1,可以发现 Schema 设置后无法正确回显状态,再次打开浮层也拿不到之前的绑定值。
引擎的 `field.isUseVariable()` 判定有误,ArraySetter + VariableSetter 会将 mock 值设置为之前的值,getValue 时得到 mock 值从而判定异常。
> 3. ObjectSetter 的值能绑定到 Schema,能正确回显,但触发 blur 后再次 focus,绑定值回退到之前的状态。
这个问题类似 1,createSettingFieldView 导致的覆盖。只是 ObjectSetter 的更新频次没有 ArraySetter 那么勤,所以表现得跟 1 不一样。
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.