Menambahkan interaktivitas ke visual menggunakan pilihan visual Power BI
Power BI menyediakan dua cara untuk berinteraksi dengan visual - memilih dan memfilter. Contoh berikut menunjukkan cara memilih item dari satu visual dan memberi tahu visual lain dalam laporan tentang status pilihan baru.
Antarmuka sesuai dengan Selection
objek:
export interface ISelectionId {
equals(other: ISelectionId): boolean;
includes(other: ISelectionId, ignoreHighlight?: boolean): boolean;
getKey(): string;
getSelector(): Selector;
getSelectorsByColumn(): SelectorsByColumn;
hasIdentity(): boolean;
}
Menggunakan manajer pemilihan untuk memilih titik data
Objek host visual menyediakan metode untuk membuat instans manajer pemilihan. Manajer pilihan memiliki metode yang sesuai untuk setiap tindakan berikut:
- Pilih
- Menghapus pilihan
- Menampilkan menu konteks
- Menyimpan pilihan saat ini
- Memeriksa status pilihan
Membuat instans manajer pemilihan
Untuk menggunakan pengelola pilihan, buat instans manajer pilihan. Biasanya, visual membuat instans manajer pilihan di bagian constructor
objek visual.
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();
}
// ...
}
Membuat instans penyusun pilihan
Saat instans manajer pemilihan dibuat, Anda perlu membuat selections
untuk setiap titik data visual. Metode createSelectionIdBuilder
objek host visual menghasilkan pilihan untuk setiap titik data. Metode ini mengembalikan instans objek dengan antarmuka 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;
}
Objek ini memiliki metode yang sesuai untuk membuat selections
untuk berbagai jenis pemetaan tampilan data.
Catatan
Metode withTable
dan withMatrixNode
diperkenalkan pada API 2.5.0 dari visual Power BI.
Jika Anda perlu menggunakan pilihan untuk pemetaan tampilan data tabel atau matriks, perbarui ke API versi 2.5.0 atau yang lebih tinggi.
Membuat pilihan untuk pemetaan tampilan data kategoris
Mari kita tinjau bagaimana pilihan mewakili pemetaan tampilan data kategoris untuk contoh model semantik:
Produsen | Tipe | Nilai |
---|---|---|
Chrysler | Mobil Domestik | 28883 |
Chrysler | Truk Domestik | 117131 |
Chrysler | Mobil Impor | 0 |
Chrysler | Truk Impor | 6362 |
Ford | Mobil Domestik | 50032 |
Ford | Truk Domestik | 122446 |
Ford | Mobil Impor | 0 |
Ford | Truk Impor | 0 |
GM | Mobil Domestik | 65426 |
GM | Truk Domestik | 138122 |
GM | Mobil Impor | 197 |
GM | Truk Impor | 0 |
Honda | Mobil Domestik | 51450 |
Honda | Truk Domestik | 46115 |
Honda | Mobil Impor | 2932 |
Honda | Truk Impor | 0 |
Nissan | Mobil Domestik | 51476 |
Nissan | Truk Domestik | 47343 |
Nissan | Mobil Impor | 5485 |
Nissan | Truk Impor | 1430 |
Toyota | Mobil Domestik | 55643 |
Toyota | Truk Domestik | 61227 |
Toyota | Mobil Impor | 20799 |
Toyota | Truk Impor | 23614 |
Visual menggunakan pemetaan tampilan data berikut:
{
"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"
}
}
]
}
}
}
}
]
}
Dalam contoh sebelumnya, Manufacturer
adalah columns
dan Type
adalah rows
. Seri dibuat dengan mengelompokkan nilai menurut rows
(Type
).
Visual harus dapat menggoreng data dengan Manufacturer
atau Type
.
Misalnya, jika pengguna memilih Chrysler
menurut Manufacturer
, visual lain harus menampilkan data berikut:
Produsen | Tipe | Nilai |
---|---|---|
Chrysler | Mobil Domestik | 28883 |
Chrysler | Truk Domestik | 117131 |
Chrysler | Mobil Impor | 0 |
Chrysler | Truk Impor | 6362 |
Saat pengguna memilih Import Car
berdasarkan Type
(memilih data menurut seri), visual lain harus menampilkan data berikut:
Produsen | Tipe | Nilai |
---|---|---|
Chrysler | Mobil Impor | 0 |
Ford | Mobil Impor | 0 |
GM | Mobil Impor | 197 |
Honda | Mobil Impor | 2932 |
Nissan | Mobil Impor | 5485 |
Toyota | Mobil Impor | 20799 |
Untuk menampilkan data irisan, isi keranjang data visual sebagai berikut:
Dalam contoh sebelumnya, Manufacturer
adalah kategori (kolom), Type
adalah seri (baris), dan Sales
untuk Values
seri.
Catatan
Values
diperlukan untuk menampilkan seri karena, menurut pemetaan tampilan data, Values
dikelompokkan menurut Rows
data.
Membuat pilihan untuk kategori
// 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);
}
Dalam kode sampel sebelumnya, kita melakukan iterasi melalui semua kategori. Dalam setiap perulangan, kami memanggil createSelectionIdBuilder
untuk membuat pilihan berikutnya untuk setiap kategori dengan memanggil withCategory
metode penyusun pilihan. Metode createSelectionId
ini digunakan sebagai metode akhir untuk mengembalikan objek yang dihasilkan selection
.
withCategory
Dalam metode , kami meneruskan kolom category
, dalam sampel, Manufacturer
, dan indeks elemen kategori.
Membuat pilihan untuk seri
// 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);
});
Membuat pilihan untuk pemetaan tampilan data tabel
Contoh berikut menunjukkan pemetaan tampilan data tabel:
{
"dataRoles": [
{
"displayName": "Values",
"name": "values",
"kind": "GroupingOrMeasure"
}
],
"dataViewMappings": [
{
"table": {
"rows": {
"for": {
"in": "values"
}
}
}
}
]
}
Untuk membuat pilihan untuk setiap baris pemetaan tampilan data tabel, panggil withTable
metode penyusun pilihan.
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();
}
}
Kode visual melakukan iterasi baris tabel dan setiap baris memanggil withTable
metode tabel. withTable
Parameter metode adalah table
objek dan indeks baris tabel.
Buat pilihan untuk pemetaan tampilan data matriks
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);
});
}
}
}
Dalam sampel, nodeWalker
secara rekursif memanggil setiap node dan node turunan.
nodeWalker
membuat objek nodeSelection
pada setiap panggilan. Setiap nodeSelection
mewakili selection
node yang sesuai.
Pilih titik data untuk menggorok visual lain
Dalam contoh ini, kita membuat handler klik untuk elemen tombol. Handler memanggil metode select
dari manajer pemilihan dan meneruskan objek pemilihan.
button.addEventListener("click", () => {
// handle click event to apply correspond selection
this.selectionManager.select(categorySelectionId);
});
Antarmuka select
metode :
interface ISelectionManager {
// ...
select(selectionId: ISelectionId | ISelectionId[], multiSelect?: boolean): IPromise<ISelectionId[]>;
// ...
}
Metode select
ini dapat menerima array pilihan. Ini memungkinkan visual Anda memilih beberapa titik data sekaligus. Parameter kedua, multiSelect
, bertanggung jawab atas multi-pilihan. Jika multiSelect
benar, Power BI tidak menghapus status pilihan sebelumnya saat menerapkan pilihan saat ini. Jika nilai salah, pilihan sebelumnya akan ditimpa.
Contoh umum penggunaan multiSelect
adalah menangani status tombol Ctrl pada peristiwa klik. Saat tombol Ctrl ditahan, Anda dapat memilih lebih dari satu objek.
button.addEventListener("click", (mouseEvent) => {
const multiSelect = (mouseEvent as MouseEvent).ctrlKey;
this.selectionManager.select(seriesSelectionId, multiSelect);
});