javascript - data studio,数据变化时如何移除 Canvas ?

标签 javascript canvas looker-studio deck.js

我使用 Deckgl 构建了这个自定义视觉效果,在经历了很多障碍后才成功,我不是 JavaScript 开发人员,所以我真的不知道我在做什么,这是代码

const dscc = require('@google/dscc');
const viz = require('@google/dscc-scripts/viz/initialViz.js');
const local = require('./localMessage.js');
const {Deck} = require ('@deck.gl/core');
const  {ScatterplotLayer} = require('@deck.gl/layers');
//const {Deck, ScatterplotLayer} = deck;
//import {ScatterplotLayer} from '@deck.gl/layers';
// change this to 'true' for local development
// change this to 'false' before deploying
export const LOCAL = false;

// create and add the canvas
var canvasElement = document.createElement('canvas');
// var ctx = canvasElement.getContext('2d');
// canvasElement.id = 'container';
// //document.body.appendChild(canvasElement);


const drawViz = (data) => {

  var height = dscc.getHeight();
  var width = dscc.getWidth();
  // clear the canvas
  var ctx = canvasElement.getContext('2d');

  // clear the canvas.
  ctx.clearRect(0, 0, canvasElement.width, canvasElement.height);

  // set the canvas width and height
  ctx.canvas.width = dscc.getWidth();
  ctx.canvas.height = dscc.getHeight();
  // code
  var data1 = data.tables.DEFAULT;
  var data2 = JSON.stringify(data1);
  var data3 = data2.replace(/\"]/g, "]");
  var data4 = data3.replace(/\["/g, "[");
  var data4 = JSON.parse(data4);
  console.log(data4);
  const INITIAL_VIEW_STATE = {
    bearing: 0,
    longitude: 143.499772,
    latitude:  -34.7773053,
    zoom: 15,
    minZoom: 5,
    maxZoom: 20,
    pitch: 40.5,
  };
new Deck({
  initialViewState: INITIAL_VIEW_STATE,
  controller: true,
  layers: [
    new ScatterplotLayer({
      data : data4,
      getPosition: d => d.coordinateid,
      getRadius: d => d.sizeid,
      getFillColor: d => d.colorid,
    })
  ],

});
};
// renders locally
if (LOCAL) {
  drawViz(local.message);

} else {
  dscc.subscribeToData(drawViz, {transform: dscc.objectTransform});
}

根据文档,这一行应该清除 Canvas ,

ctx.clearRect(0, 0, canvasElement.width, canvasElement.height);

但这不起作用,我得到的是当我通过单击过滤器更改数据时,新图层按预期渲染,但旧图层仍然卡住,我无法移动它

enter image description here

显然,我需要一些东西来删除旧的 SVG

我附上了报告的副本,注意过滤时之前的 map 没有清除

datastudio.google.com/reporting/df3d5442-12d7-489e-99fe-90031a7ecc9f

感谢 Ralph Spandl 的帮助,经过一番折腾,我使它可以与

document.body.innerHTML = "";

最佳答案

每次调整视觉效果大小或更改设置时,Data Studio 都会调用您的drawViz 函数。这意味着每次调用该行时

var canvasElement = document.createElement('canvas');

这基本上创建了一个新的 Canvas 标签。

因此,您必须首先尝试删除您的 Canvas 标签。我的建议是

document.getElementById("container").remove();

然后像您已经在做的那样创建 Canvas

var canvasElement = document.createElement('canvas');
canvasElement.id = 'container';

请注意,我取消了将 ID 应用于您的标签的行的注释。 如果第一次创建视觉对象,则 ID 为“container”的标签不存在,但这不会影响脚本的其余部分。

您还可以查看 Sunburst 示例:
https://github.com/googledatastudio/experimental-visualizations/blob/master/viz/sunburst-drilldown/sunburst/sunburst.js

函数“prepareDOM”会删除所有标签,并在绘制其他内容之前调用。

关于javascript - data studio,数据变化时如何移除 Canvas ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58210391/

相关文章:

javascript - 使用 javascript 缺少内容更改 html 内容

android - 翻转算法?

javascript - 在 HTML5 Canvas 中更改描边颜色

google-analytics - 备份 Google Data Studio、跟踪代码管理器和 Analytics 配置的方法?

looker-studio - 重置所有操作 - Google Data Studio 中的交互式过滤器

javascript - 自执行函数中的参数是否必要?

javascript - 如何引用匿名函数Javascript的父参数

javascript - D3.js 线图不接触端点

javascript - 如何在 Canvas 中重绘矩形?

looker-studio - 在 Google Data Studio 中根据各个年、月、日创建复合日期