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
相关产品推荐
相关产品推荐

