You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qlik Sense扩展:无法在属性面板中引用Ref(疑似Bug?)

这是Qlik Sense的预期设计,并非Bug

你遇到的问题其实是Qlik Sense属性面板层级结构的正常表现,原因在于uses: "dimensions"这个预定义组件的属性上下文隔离机制。

为什么layout.props.myTextBox会返回undefined?

当你使用uses: "dimensions"引用官方预定义的维度容器时,这个容器会创建一个独立的属性命名空间——所有放在这个容器items里的自定义属性,都会被归类到layout.dimensions对象下,而不是全局的props对象中。

你的代码里把myTextBox(ref为props.myTextBox)放在dimensions.items里,它的实际路径其实是layout.dimensions.props.myTextBox,直接访问layout.props.myTextBox自然拿不到值。

两种解决方法

方法1:调整属性路径,适配维度section的命名空间

修改myTextBox的ref,去掉props.前缀,让它属于维度section的属性集合:

var myTextBox = {
  ref: "myTextBox", // 移除props.前缀
  label: "My text box",
  type: "string"
};

然后在paint函数中通过正确的路径获取:

paint: function ($element, layout) {
  console.log(layout.dimensions.myTextBox); // 正常获取值
}

方法2:将自定义属性移到独立的全局section

如果希望这个文本框属性属于全局props,不要把它放在维度容器里,单独创建一个自定义属性section:

// 新增自定义属性面板
var customPropsSection = {
  label: "Custom Settings",
  type: "items",
  items: {
    myTextBox: myTextBox
  }
};

// 主属性面板定义中加入这个section
return {
  type: "items",
  component: "accordion",
  items: {
    dimensions: dimensions,
    measures: measures,
    customProps: customPropsSection, // 新增的全局属性section
    appearance: appearanceSection,
  }
};

这样就能通过layout.props.myTextBox正常访问属性值了。

补充说明

Qlik Sense的这种设计是为了让不同功能模块(维度、度量、外观)的属性保持层级隔离,避免跨模块的属性命名冲突。所有通过uses引用的预定义组件,都会将自身属性(包括自定义附加项)封装在对应的layout子对象下,这是官方文档中隐含的层级规则哦。

内容的提问来源于stack exchange,提问作者Peachman1997

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:24:14