问题描述
在 Dashboard panel 的 detailUrl 或 custom.links 中使用 ${__field.labels.xxx} 格式的变量时,变量无法被正确替换。
例如配置:
/dashboard/58?area=${__field.labels.area}&ident=${__field.labels.ident}
点击链接后变量保持原样 ${__field.labels.area} 未被替换,或被错误替换为 ${__field}ield.labels.area。
根本原因
src/pages/dashboard/Variables/utils/formatString.ts 第 22 行的正则:
processedStr = processedStr.replace(/$([a-zA-Z0-9_]+)/g, (match, varName) => {
这个正则会在点号处停止匹配。当输入 area=${__field.labels.area} 时:
第一步正则把 $__field 单独匹配出来(停在点号处)
因为 __field 不存在于 data,尝试匹配更短的变量名也失败
结果 ${__field.labels.area} 被破坏成 ${__field}ield.labels.area
后续的 ${...} 处理无法正确匹配
复现步骤
创建包含 table 或 hexbin panel 的 dashboard
在 panel 的 custom.links 中配置 URL:/detail?area=${__field.labels.area}
点击链接
变量未被正确替换
期望行为
${__field.labels.xxx} 应该能正确替换为对应的 label 值。
修复建议
把 ${...} 处理移到 $variableName 处理之前,避免正则破坏 ${...} 结构:
try {
// 0. 先处理 ${variableName} 格式(支持点号键名)
processedStr = processedStr.replace(/${([^}]+)}/g, (match, varName) => {
if (Object.prototype.hasOwnProperty.call(data, varName)) {
return String(data[varName] ?? '');
}
return match;
});
// 1. 处理 $variableName 格式
processedStr = processedStr.replace(/\$([a-zA-Z0-9_]+)/g, ...);
// ...
问题描述
在 Dashboard panel 的 detailUrl 或 custom.links 中使用 ${__field.labels.xxx} 格式的变量时,变量无法被正确替换。
例如配置:
/dashboard/58?area=${__field.labels.area}&ident=${__field.labels.ident}
点击链接后变量保持原样 ${__field.labels.area} 未被替换,或被错误替换为 ${__field}ield.labels.area。
根本原因
src/pages/dashboard/Variables/utils/formatString.ts 第 22 行的正则:
processedStr = processedStr.replace(/$([a-zA-Z0-9_]+)/g, (match, varName) => {
这个正则会在点号处停止匹配。当输入 area=${__field.labels.area} 时:
第一步正则把 $__field 单独匹配出来(停在点号处)
因为 __field 不存在于 data,尝试匹配更短的变量名也失败
结果 ${__field.labels.area} 被破坏成 ${__field}ield.labels.area
后续的 ${...} 处理无法正确匹配
复现步骤
创建包含 table 或 hexbin panel 的 dashboard
在 panel 的 custom.links 中配置 URL:/detail?area=${__field.labels.area}
点击链接
变量未被正确替换
期望行为
${__field.labels.xxx} 应该能正确替换为对应的 label 值。
修复建议$variableName 处理之前,避免正则破坏 $ {...} 结构:
把 ${...} 处理移到
try {
// 0. 先处理 ${variableName} 格式(支持点号键名)
processedStr = processedStr.replace(/${([^}]+)}/g, (match, varName) => {
if (Object.prototype.hasOwnProperty.call(data, varName)) {
return String(data[varName] ?? '');
}
return match;
});