Tableau JS筛选器:将筛选器从一个仪表板传递到所有其他仪表板

时间:2018-09-21 15:15:27

标签: javascript tableau

我对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

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

0 个答案:

没有答案