Power Bi 自定义视觉效果:列顺序不正确

问题描述 投票:0回答:2

我正在开发 Power Bi 自定义视觉对象,但有一个问题:当用户向视觉对象添加维度时,UI 中显示的顺序并不反映我从 Power Bi 获取的数据中列的实际顺序。例如,请参阅此屏幕截图:

enter image description here

这在很多场景下都是非常有限的,例如,如果我想按照用户设置的顺序绘制一个包含列的表格。

为什么 API 会这样?我觉得不符合逻辑,我做错了什么吗?这是数据绑定定义(如果有帮助的话):

"dataRoles": [
    {
        "displayName": "Fields",
        "name": "fields",
        "kind": "Grouping"
    },
    {
        "displayName": "Measures",
        "name": "measures",
        "kind": "Measure"
    }

],
"dataViewMappings": [
    {
        "table": {
            "rows": {
                "select": [
                    {
                        "for": {
                            "in": "fields"
                        }
                    },
                    {
                        "for":{
                            "in": "measures"
                        }
                    }
                ],
                "dataReductionAlgorithm": {
                    "window": {
                        "count": 30000
                    }
                }
            }
        }

    }
]
powerbi powerbi-custom-visuals
2个回答
1
投票

我想我已经解决了。 您可以像这样获得实际的列顺序:

dataView.metadata.columns.forEach(col => {
  let columnOrder = col['rolesIndex'].XXX[0];
});

其中

XXX
是数据角色的名称,在我问题的示例中为
fields

请注意,您必须像上面那样通过键名称访问

rolesIndex
属性(或者在访问之前转换为
any
),因为
DataViewMetadataColumn
类型由于某种原因缺少该属性。


0
投票

@Master_T,您还可以更进一步,使用代码扩展来迭代所有数据角色。

          dataView.metadata.columns.forEach(col => {
        let rolesIndex = col['rolesIndex'];
        console.log("rolesIndex:",  rolesIndex )

        if (rolesIndex) {
            // Iterate through the roles
            Object.keys(rolesIndex).forEach(roleName => {
                console.log(`Role Name: ${roleName}`);
    
                // Iterate through the indices for this role
                rolesIndex[roleName].forEach(index => {
                    console.log(`Role Index for ${roleName}: ${index}`);
                });
            });
        } else {
            console.log("rolesIndex is undefined for this column.");
        }
      });

请注意,我们需要谨慎使用这种方法,因为它没有使用已发布的 api,并且将来可能会发生变化,但我的理解是,这是目前可以确定列顺序的唯一方法,所以我将一直使用它,直到它损坏或被“批准”的方法取代。

© www.soinside.com 2019 - 2024. All rights reserved.