我正在开发 Power Bi 自定义视觉对象,但有一个问题:当用户向视觉对象添加维度时,UI 中显示的顺序并不反映我从 Power Bi 获取的数据中列的实际顺序。例如,请参阅此屏幕截图:
这在很多场景下都是非常有限的,例如,如果我想按照用户设置的顺序绘制一个包含列的表格。
为什么 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
}
}
}
}
}
]
我想我已经解决了。 您可以像这样获得实际的列顺序:
dataView.metadata.columns.forEach(col => {
let columnOrder = col['rolesIndex'].XXX[0];
});
其中
XXX
是数据角色的名称,在我问题的示例中为 fields
。
请注意,您必须像上面那样通过键名称访问
rolesIndex
属性(或者在访问之前转换为 any
),因为 DataViewMetadataColumn
类型由于某种原因缺少该属性。
@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,并且将来可能会发生变化,但我的理解是,这是目前可以确定列顺序的唯一方法,所以我将一直使用它,直到它损坏或被“批准”的方法取代。