Føj interaktivitet til visualisering ved hjælp af valg af Power BI-visualiseringer
Power BI indeholder to måder at interagere med visualiseringer på – valg og filtrering. I følgende eksempel kan du se, hvordan du vælger et element fra én visualisering og giver de andre visualiseringer i rapporten besked om den nye markeringstilstand.
Grænsefladen svarer til et Selection
objekt:
export interface ISelectionId {
equals(other: ISelectionId): boolean;
includes(other: ISelectionId, ignoreHighlight?: boolean): boolean;
getKey(): string;
getSelector(): Selector;
getSelectorsByColumn(): SelectorsByColumn;
hasIdentity(): boolean;
}
Brug valgstyringen til at vælge datapunkter
Det visuelle værtsobjekt indeholder en metode til oprettelse af en forekomst af valgstyringen. Valgstyringen har en tilsvarende metode for hver af følgende handlinger:
- Markér
- Ryd markeringen
- Vis genvejsmenuen
- Gem de aktuelle markeringer
- Kontrollér markeringstilstanden
Opret en forekomst af valgstyringen
Hvis du vil bruge valgstyringen, skal du oprette forekomsten af en valgstyring. Visualiseringer opretter normalt en forekomst af valgstyringen constructor
i afsnittet i visualiseringsobjektet.
export class Visual implements IVisual {
private target: HTMLElement;
private host: IVisualHost;
private selectionManager: ISelectionManager;
// ...
constructor(options: VisualConstructorOptions) {
this.host = options.host;
// ...
this.selectionManager = this.host.createSelectionManager();
}
// ...
}
Opret en forekomst af valggeneratoren
Når forekomsten af valgstyringen oprettes, skal du oprette selections
for hvert datapunkt i visualiseringen. Metoden for visualiseringens createSelectionIdBuilder
værtsobjekt genererer et valg for hvert datapunkt. Denne metode returnerer en forekomst af objektet med grænsefladen powerbi.visuals.ISelectionIdBuilder
:
export interface ISelectionIdBuilder {
withCategory(categoryColumn: DataViewCategoryColumn, index: number): this;
withSeries(seriesColumn: DataViewValueColumns, valueColumn: DataViewValueColumn | DataViewValueColumnGroup): this;
withMeasure(measureId: string): this;
withMatrixNode(matrixNode: DataViewMatrixNode, levels: DataViewHierarchyLevel[]): this;
withTable(table: DataViewTable, rowIndex: number): this;
createSelectionId(): ISelectionId;
}
Dette objekt har tilsvarende metoder til at oprette selections
for forskellige typer tilknytninger af datavisninger.
Bemærk
Metoderne withTable
og withMatrixNode
blev introduceret i API 2.5.0 af Power BI-visualiseringerne.
Hvis du har brug for at bruge valg til tilknytninger af tabel- eller matrixdatavisninger, skal du opdatere til API-version 2.5.0 eller nyere.
Opret valg til tilknytning af kategoriske datavisninger
Lad os gennemgå, hvordan valg repræsenterer tilknytning af kategoriske datavisninger for en semantisk eksempelmodel:
Producent | Skriv | Værdi |
---|---|---|
Chrysler | Privat bil | 28883 |
Chrysler | Indenlandsk lastbil | 117131 |
Chrysler | Importér bil | 0 |
Chrysler | Importér lastbil | 6362 |
Ford | Privat bil | 50032 |
Ford | Indenlandsk lastbil | 122446 |
Ford | Importér bil | 0 |
Ford | Importér lastbil | 0 |
GM | Privat bil | 65426 |
GM | Indenlandsk lastbil | 138122 |
GM | Importér bil | 197 |
GM | Importér lastbil | 0 |
Honda | Privat bil | 51450 |
Honda | Indenlandsk lastbil | 46115 |
Honda | Importér bil | 2932 |
Honda | Importér lastbil | 0 |
Nissan | Privat bil | 51476 |
Nissan | Indenlandsk lastbil | 47343 |
Nissan | Importér bil | 5485 |
Nissan | Importér lastbil | 1430 |
Toyota | Privat bil | 55643 |
Toyota | Indenlandsk lastbil | 61227 |
Toyota | Importér bil | 20799 |
Toyota | Importér lastbil | 23614 |
Visualiseringen bruger følgende tilknytning af datavisninger:
{
"dataRoles": [
{
"displayName": "Columns",
"name": "columns",
"kind": "Grouping"
},
{
"displayName": "Rows",
"name": "rows",
"kind": "Grouping"
},
{
"displayName": "Values",
"name": "values",
"kind": "Measure"
}
],
"dataViewMappings": [
{
"categorical": {
"categories": {
"for": {
"in": "columns"
}
},
"values": {
"group": {
"by": "rows",
"select": [
{
"for": {
"in": "values"
}
}
]
}
}
}
}
]
}
I det foregående eksempel Manufacturer
er columns
og Type
er rows
. En serie oprettes ved at gruppere værdier efter rows
(Type
).
Visualiseringen skal kunne opdele data efter Manufacturer
eller Type
.
Hvis en bruger f.eks. vælger Chrysler
efter Manufacturer
, skal andre visualiseringer vise følgende data:
Producent | Skriv | Værdi |
---|---|---|
Chrysler | Privat bil | 28883 |
Chrysler | Indenlandsk lastbil | 117131 |
Chrysler | Importér bil | 0 |
Chrysler | Importér lastbil | 6362 |
Når brugeren vælger Import Car
efter Type
(vælger data efter serie), skal de andre visualiseringer vise følgende data:
Producent | Skriv | Værdi |
---|---|---|
Chrysler | Importér bil | 0 |
Ford | Importér bil | 0 |
GM | Importér bil | 197 |
Honda | Importér bil | 2932 |
Nissan | Importér bil | 5485 |
Toyota | Importér bil | 20799 |
Hvis du vil have vist udsnitsdata, skal du udfylde visualiseringens datakurve på følgende måde:
I det foregående eksempel Manufacturer
er kategorien (kolonner), Type
er serie (rækker) og Sales
er Values
til serier.
Bemærk
Values
er påkrævet for at vise en serie, fordi grupperes efter data i henhold til tilknytningen Values
af Rows
datavisning.
Opret valg for kategorier
// categories
const categories = dataView.categorical.categories;
// create label for 'Manufacturer' column
const p = document.createElement("p") as HTMLParagraphElement;
p.innerText = categories[0].source.displayName.toString();
this.target.appendChild(p);
// get count of category elements
const categoriesCount = categories[0].values.length;
// iterate all categories to generate selection and create button elements to use selections
for (let categoryIndex = 0; categoryIndex < categoriesCount; categoryIndex++) {
const categoryValue: powerbi.PrimitiveValue = categories[0].values[categoryIndex];
const categorySelectionId = this.host.createSelectionIdBuilder()
.withCategory(categories[0], categoryIndex) // we have only one category (only one `Manufacturer` column)
.createSelectionId();
this.dataPoints.push({
value: categoryValue,
selection: categorySelectionId
});
console.log(categorySelectionId);
// create button element to apply selection on click
const button = document.createElement("button") as HTMLButtonElement;
button.value = categoryValue.toString();
button.innerText = categoryValue.toString();
button.addEventListener("click", () => {
// handle click event to apply correspond selection
this.selectionManager.select(categorySelectionId);
});
this.target.appendChild(button);
}
I den foregående eksempelkode gentager vi alle kategorier. I hver gentagelse kalder createSelectionIdBuilder
vi for at oprette det næste valg for hver kategori ved at kalde withCategory
metoden for valggeneratoren. Metoden createSelectionId
bruges som en endelig metode til at returnere det genererede selection
objekt.
I metoden withCategory
overfører vi kolonnen for category
i eksemplet, dens Manufacturer
og indekset for kategorielementet.
Opret markeringer for serier
// get groupped values for series
const series: powerbi.DataViewValueColumnGroup[] = dataView.categorical.values.grouped();
// create label for 'Type' column
const p2 = document.createElement("p") as HTMLParagraphElement;
p2.innerText = dataView.categorical.values.source.displayName;
this.target.appendChild(p2);
// iterate all series to generate selection and create button elements to use selections
series.forEach( (ser: powerbi.DataViewValueColumnGroup) => {
// create selection id for series
const seriesSelectionId = this.host.createSelectionIdBuilder()
.withSeries(dataView.categorical.values, ser)
.createSelectionId();
this.dataPoints.push({
value: ser.name,
selection: seriesSelectionId
});
// create button element to apply selection on click
const button = document.createElement("button") as HTMLButtonElement;
button.value =ser.name.toString();
button.innerText = ser.name.toString();
button.addEventListener("click", () => {
// handle click event to apply correspond selection
this.selectionManager.select(seriesSelectionId);
});
this.target.appendChild(button);
});
Opret valg til tilknytning af tabeldatavisning
I følgende eksempel vises tilknytning af tabeldatavisninger:
{
"dataRoles": [
{
"displayName": "Values",
"name": "values",
"kind": "GroupingOrMeasure"
}
],
"dataViewMappings": [
{
"table": {
"rows": {
"for": {
"in": "values"
}
}
}
}
]
}
Hvis du vil oprette en markering for hver række i tilknytningen af tabeldatavisninger, skal du kalde withTable
metoden for valggenerator.
public update(options: VisualUpdateOptions) {
const dataView = options.dataViews[0];
dataView.table.rows.forEach((row: DataViewTableRow, rowIndex: number) => {
this.target.appendChild(rowDiv);
const selection: ISelectionId = this.host.createSelectionIdBuilder()
.withTable(dataView.table, rowIndex)
.createSelectionId();
}
}
Visualkoden gentager rækkerne i tabellen, og hver række kalder tabelmetoden withTable
. Parametrene withTable
for metoden er table
objektet og indekset for tabelrækken.
Opret valg til tilknytning af matrixdatavisning
public update(options: VisualUpdateOptions) {
const host = this.host;
const rowLevels: powerbi.DataViewHierarchyLevel[] = dataView.matrix.rows.levels;
const columnLevels: powerbi.DataViewHierarchyLevel[] = dataView.matrix.rows.levels;
// iterate rows hierarchy
nodeWalker(dataView.matrix.rows.root, rowLevels);
// iterate columns hierarchy
nodeWalker(dataView.matrix.columns.root, columnLevels);
function nodeWalker(node: powerbi.DataViewMatrixNode, levels: powerbi.DataViewHierarchyLevel[]) {
const nodeSelection = host.createSelectionIdBuilder().withMatrixNode(node, levels);
if (node.children && node.children.length) {
node.children.forEach(child => {
nodeWalker(child, levels);
});
}
}
}
I eksemplet nodeWalker
kalder rekursivt hver node og den underordnede node.
nodeWalker
opretter et nodeSelection
objekt ved hvert opkald. Hver nodeSelection
repræsenterer en selection
af de tilsvarende noder.
Vælg datapunkter for at opdele andre visualiseringer
I dette eksempel har vi oprettet en klikhandler for knapelementer. Handleren kalder select
metoden for valgstyringen og overfører markeringsobjektet.
button.addEventListener("click", () => {
// handle click event to apply correspond selection
this.selectionManager.select(categorySelectionId);
});
Grænsefladen for select
metoden:
interface ISelectionManager {
// ...
select(selectionId: ISelectionId | ISelectionId[], multiSelect?: boolean): IPromise<ISelectionId[]>;
// ...
}
Metoden select
kan acceptere en matrix af valg. Dette gør det muligt for visualiseringen at markere flere datapunkter på én gang. Den anden parameter, , multiSelect
er ansvarlig for flere valg. Hvis multiSelect
er true, rydder Power BI ikke den forrige markeringstilstand, når den aktuelle markering anvendes. Hvis værdien er false, overskrives den forrige markering.
Et typisk eksempel på brug multiSelect
er håndtering af ctrlknaptilstanden for en klikhændelse. Når ctrlknappen holdes nede, kan du markere mere end ét objekt.
button.addEventListener("click", (mouseEvent) => {
const multiSelect = (mouseEvent as MouseEvent).ctrlKey;
this.selectionManager.select(seriesSelectionId, multiSelect);
});