2015-11-13 64 views
7

恢复的Tableau图表的当前视图状态的问题:保存并通过JavaScript API

我怎么能存储 - 然后在以后检索 - 一个的Tableau视图的自定义状态,通过JavaScript的API?

说明:

我的网站上,我们目前允许任何用户进行协作的一组的Tableau意见纳入供以后使用一个PowerPoint类的在线演示文稿。在我们当前的实现中,Tableau图的状态不会被存储,因此用户必须每次都在应用演示时使用他或她想要的过滤器,选择工作表等。这是我们现在想要避免的。

为最简单的解决方案将是存储和检索的“分享” -links通过底杆接口访问的一个;这些链接包含当前视图的状态,但到目前为止,我们还没有做到这一点:首先,由于域问题,我们不能简单地从嵌入代码iframe中获取共享链接;其次,API方法workbook.getUrl()似乎不包括当前视图的状态。

我currenty展望workbook.rememberCustomViewAsync(名称)workbook.showCustomViewAsync(名称)方法,这似乎是一个可行的解决方案。但是,我似乎无法从这两种方法中得到任何明智的结果,因为它们在运行时最终会给出模糊的,无信息的500错误。

示例文件,并且错误:

为了更好地说明此问题,我已经创建了一个最小demo(下面片断),试图使用上述第二方法。在谷歌浏览器中打开时,两种按钮('保存状态'和'检索状态')都不适用于我,并且可以在开发者工具中看到以下错误(分别为http响应消息和开发者控制台输出):

HTTP响应:

<br> 
2015-11-11 16&#x3a;14&#x3a;17.916 
&#x28;VkNpWQrCQaIAACQo2YYAAAPi,0,0&#x29; 

控制台错误:

POST http://public.tableau.com/vizql/w/Book6_426/v/YRKE/save_customized_view/sessions/208A699D34E14708A2268AA10A827C99-0:0 500 (Internal Server Error) 

有谁知道我怎么能解决这个问题,无论是由希提供的代码示例工作(描述的第二种方法)还是通过其他方式?任何帮助,将不胜感激!

PS:这里的片段模拟器会导致访问控制允许来源的错误。该文件也已发布here

<html> 
 

 
<head> 
 
    <title>A simple Tableau API demo</title> 
 
    <!--script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script--> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> 
 
    <!--script type="text/javascript" src="https://online.tableau.com/javascripts/api/tableau_v8.js"></script--> 
 
    <script type="text/javascript" src="https://online.tableau.com/javascripts/api/tableau-2.min.js "></script> 
 
</head> 
 

 
<body> 
 

 

 
    <H2>Custom view storage demo</H2> 
 

 
    <button id="remember-button"> 
 
    Remember state 'test' 
 
    </button> 
 
    <button id="retrieve-button"> 
 
    Retrieve state 'test' 
 
    </button> 
 

 
    <div id="viz-placeholder" style="width: 1000px; height: 1000px; display: block;"></div> 
 

 

 
    <script> 
 
    
 
    // Render tableau graph 
 
    function initializeViz() { 
 
     var placeholderDiv = document.getElementById("viz-placeholder"); 
 
     var url = "https://public.tableau.com/views/Book6_426/YRKE"; 
 
     var options = { 
 
     width: placeholderDiv.offsetWidth, 
 
     height: placeholderDiv.offsetHeight, 
 
     hideTabs: true, 
 
     hideToolbar: true, 
 
     onFirstInteractive: function() { 
 
      workbook = viz.getWorkbook(); 
 
      activeSheet = workbook.getActiveSheet(); 
 
     } 
 
     }; 
 
     viz = new tableau.Viz(placeholderDiv, url, options); 
 
    } 
 

 
    $(initializeViz) 
 

 
    
 
    // Assign and set up button actions for storing and retrieving the custom view 
 
    var customViewName = "test"; 
 

 
    $('#remember-button').click(function() { 
 
     console.log("Remembering: ", customViewName); 
 
     
 
     // Try to save state, or print error 
 
     viz.getWorkbook().rememberCustomViewAsync(customViewName).otherwise(function(err) { 
 
     console.log("An error occured:"); 
 
     console.log(err); 
 
     }); 
 
     
 
    }); 
 

 
    $('#retrieve-button').click(function() { 
 
     console.log("Retrieving: ", customViewName); 
 
     
 
     // Try to retrieve state, or print error 
 
     viz.getWorkbook().showCustomViewAsync(customViewName).otherwise(function(err) { 
 
     console.log("An error occured:"); 
 
     console.log(err); 
 
     }); 
 
     
 
    }); 
 
    </script> 
 

 

 
</body> 
 

 
</html>

回答

2

欧凯,所以我一直在用的Tableau客户支持联系,他们似乎已经找到了问题。

显然,javascript-API的某些元素仅适用于网上的Tableau和的Tableau服务器 - 的Tableau公开。

换句话说,Tableau Public托管的图表不支持函数workbook.rememberCustomViewAsync('customViewName') - 例如以上示例中使用的图表(https://public.tableau.com/views/...)。

+1

嘿,我有一个问题。我知道,自定义视图是在一个工作簿中的所有仪表板之间共享的。有没有办法将具有相同过滤器的工作簿1的仪表板1的自定义视图应用于工作簿2的仪表板2? –

+0

@DeepanshuKalra,恐怕我帮不了你。我建议你发布一个问题官方支持论坛。他们最终帮助我! –