问题描述
当ListView将服务端查询到的数据以data prop(inline array)传递给下层SchemaRenderer(ObjectGrid)时,ObjectGrid会检测到inline data存在,于是直接跳过 object schema 的加载:
useEffect(() => {
if (hasInlineData) return; // 🔴 直接 return!完全跳过 getObjectSchema()
// ...省略...
}, [objectName, ...]);
而此时ObjectGrid的字段columns通常是string[](如['order','product','item_type']),生成列时会走如下逻辑:
const fieldDef = objectSchema?.fields?.[fieldName];
const resolvedType = fieldDef?.type || inferColumnType({ field: fieldName }) || null;
由于objectSchema为null,无法获得字段类型信息,导致所有自定义渲染器(比如lookup/master_detail/select/user/status)全丢失,只能兜底为String(value)。
这会造成:
- 关联型字段(如lookup、user等)无论服务端是否expand,始终只显示ID字符串(或出���[object Object])
- select/status等字段不会被注册的CellRenderer渲染
- 格式化/嵌套/自定义渲染全部失效
表现举例
- 用户只看到order/produc/user等显示"o1"、"p1"、"u1",而不是对应的名称或更多信息
- 甚至expand展开的对象,因没有CellRenderer也变成[object Object]
复现步骤
- ListView正常加载一个有lookup/关联/选项等类型字段的数据对象。
- 服务端已支持expand,数据能带出完整对象。
- ObjectGrid通过props.data收到inline数据,不会加载objectSchema。
- "generateColumns"函数里字段类型全部靠猜,导致CellRenderer注册机制无效。
根因总结
根本原因是ObjectGrid将"inline data"和"无需schema"混淆,实际上无论数据来源(inline/server),只要配置了objectName都应加载一次schema用于推断字段类型及渲染器选择。
修复建议
- ObjectGrid props.data存在时,仅跳过数据fetch,但应始终加载一次objectName对应的objectSchema并据此生成columns与类型。
- 保证CellRenderer注册逻辑和后端/inline数据模式一致。
- 修复后补足UT,避免类似回归。
如需代码、Trace或详细复现方法可联系@hotlong。
问题描述
当ListView将服务端查询到的数据以
dataprop(inline array)传递给下层SchemaRenderer(ObjectGrid)时,ObjectGrid会检测到inline data存在,于是直接跳过 object schema 的加载:而此时ObjectGrid的字段columns通常是
string[](如['order','product','item_type']),生成列时会走如下逻辑:由于objectSchema为null,无法获得字段类型信息,导致所有自定义渲染器(比如lookup/master_detail/select/user/status)全丢失,只能兜底为
String(value)。这会造成:
表现举例
复现步骤
根因总结
根本原因是ObjectGrid将"inline data"和"无需schema"混淆,实际上无论数据来源(inline/server),只要配置了objectName都应加载一次schema用于推断字段类型及渲染器选择。
修复建议
如需代码、Trace或详细复现方法可联系@hotlong。