我对JavaScript和Tableau JS API比较陌生。我正在尝试从一个嵌入式可视化文件中获取过滤器,并将其传递给网页上的其他可视化文件。
我正在使用此代码初始化我的主要可视化。
function initViz() {
var containerDiv = document.getElementById("vizContainer"),
url = "https://tableau.Viz",
options = {
hideTabs: true,
loadorder: -1,
hideToolbar: true,
onFirstInteractive: function () {
workbook=SumDash.getWorkbook();
activeSheet = workbook.getActiveSheet().getWorksheets()[0];
SumDash.addEventListener(tableau.TableauEventName.FILTER_CHANGE,onFilterChange);
console.log("Run this code when the viz1 has finished loading.");
}
};
var SumDash = new tableau.Viz(containerDiv, url, options);
在主可视化上更改过滤器时,我将获取字段名称和应用的值,并使用此代码更新其他可视化。
此代码有效,但速度很慢。我认为部分问题是我从中获取过滤器的仪表板具有多个工作表,并且以下代码在仪表板中的每个工作表中循环(仪表板和console.log(1)上的21个工作表打印21次)。
是否有一种方法只能传递一个工作表中的字段名和值,而不是仪表板中的每个工作表?有更有效的方法吗?
function onFilterChange(){
activeSheet.getFiltersAsync()
.then(function(promise) {
console.log(1);
var fieldName = [];
var fieldValArr = [];
for (var i=0; i< promise.length; i++) {
fieldName.push(promise[i].getFieldName());
var fieldValues = [];
for (var j=0; j< promise[i].getAppliedValues().length; j++) {
fieldValues[j] = promise[i].getAppliedValues()[j].value;
}
fieldValArr.push(fieldValues);
for (var k=0; k<fieldName.length; k++){
activeSheet1.applyFilterAsync(fieldName[k], fieldValArr[k], tableau.FilterUpdateType.REPLACE);
activeSheet2.applyFilterAsync(fieldName[k], fieldValArr[k], tableau.FilterUpdateType.REPLACE);
}
}
})
谢谢!
Tableau Desktop版本= 2018.1