我们有一个包含两个仪表板的工作簿,第一个包含一个工作表,第二个包含四个工作表。
我们正在尝试通过网址传递过滤器(该部分没问题),但我们无法获取第二个信息中心上的所有工作表进行更新。
代码循环遍历仪表板,依次激活每个仪表板,然后在每个仪表板上调用filterActiveSheet()方法。
此方法依次循环遍历每个工作表,搜索具有与提供的FieldName相同的FieldName的匹配分类过滤器,并在找到时使用applyFilterAsync()方法将其替换为提供的。
var options = {
< snip >
onFirstInteractive: function () {
workbook = viz.getWorkbook();
sheets = workbook.getPublishedSheetsInfo();
for(s = 0; s < sheets.length; s++)
{
viz.getWorkbook().activateSheetAsync(s)
.then(filterActiveSheet);
}
}
};
function filterActiveSheet(sheet) {
for (ws = 0; ws < sheet.getWorksheets().length; ws++) {
var worksheet = sheet.getWorksheets()[ws];
worksheet.getFiltersAsync()
.then(function(p) {
var f = filters.split(';');
for(y=0;y<f.length;y++){
var filter = f[y].split(':');
var filterType = $.grep(p, function(e){ return e.getFieldName() == filter[0]; });
if (filterType.length > 0) {
switch(filterType[0].getFilterType()) {
case tableau.FilterType.CATEGORICAL:
return worksheet.applyFilterAsync(filter[0], filter[1], tableau.FilterUpdateType.REPLACE);
break;
< snip >
}
}
}
});
}
}
var viz = new tableauSoftware.Viz(placeholderDiv, url, options);
我们遇到的问题是每个仪表板上只有一个工作表正在更新。逐步浏览Chrome中的JS我可以看到对applyFilterAsync()的调用预期次数似乎没有导致错误,它似乎并不想更新所有过滤器/工作表,只需要一个每个仪表板。
思考?建议?语法错误?
答案 0 :(得分:1)
getPublishedSheetsInfo()返回一个返回一个工作表和一个仪表板的集合,其中的类型可以通过调用getSheetType()来确定。您不能将getFilterAsync()直接应用于仪表板,但必须进行迭代。尝试类似:
if (sheet.getSheetType() === 'WORKSHEET') {
sheet.getFiltersAsync().then(function(filters) {
for (var x = 0; x < filters.length; x++) {
// do something
}
})
} else {
// either in a dashboard or story
var workSheetArray = sheet.getWorksheets();
for (var i = 0; i < workSheetArray.length; i++) {
workSheetArray[i].getFiltersAsync().then(function(filters) {
for (var x = 0; x < filters.length; x++) {
// do something
}
}
}
}