首页 > 解决方案 > 在 onFirstInteractive 范围内使用正确的变量

问题描述

所以我试图在使用onFirstInteractive回调时发送信息。

这是我想要做的。

function initViz() {
    var views = viz.getWorkbook().getPublishedSheetsInfo();
    for(var v = 0; v < views.length;v++) {
        var name = views[v].getName();
        var options = { hideTabs: true, hideToolbar: true, 
            onFirstInteractive: function() { 
                console.log("Viz has finished loading >" + name);
                getFilters(name);
            }
        };
        var url = views[v].getUrl();
        url = url.replace("/#/site/", "/t/");
        var containerDiv = document.createElement('DIV');
        document.body.appendChild(containerDiv);
        viz = new tableau.Viz(containerDiv, url, options);
        viz.hide();
    }
}

function getFilters(name) {
    console.log(name);
}

但似乎每次getFilters被调用,name总是以“最后的意见”为名。

创建对象时如何获得正确的nameoptions

标签: javascripttableau-api

解决方案


将函数更改为内联闭包

function initViz() {
    var views = viz.getWorkbook().getPublishedSheetsInfo();
    for(var v = 0; v < views.length;v++) {
        var name = views[v].getName();
        var options = { hideTabs: true, hideToolbar: true, 
            onFirstInteractive: (function(name) { 
                return function() { 
                    console.log("Viz has finished loading >" + name);
                    getFilters(name);
                }
            })(name)
        };
        var url = views[v].getUrl();
        url = url.replace("/#/site/", "/t/");
        var containerDiv = document.createElement('DIV');
        document.body.appendChild(containerDiv);
        viz = new tableau.Viz(containerDiv, url, options);
        viz.hide();
    }
}

function getFilters(name) {
    console.log(name);
}

来源

JavaScript 回调变量范围问题

了解 JavaScript 中的闭包、回调和承诺


推荐阅读