我是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);

在主可视化上更改过滤器时,我将获取字段名称和应用值,并使用此代码更新其他可视化 .

这段代码有效,但速度很慢 . 我认为我的部分问题是我从中获取过滤器的仪表板有多个工作表,下面的代码循环遍历仪表板中的每个工作表(仪表板上的21个工作表和console.log(1)打印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

https://public.tableau.com/javascripts/api/tableau-2.min.js