datastudio, как убрать холст при изменении данных?
Я создаю эти пользовательские визуальные эффекты с помощью 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});
}
согласно документации эта строка должна очищать холст,
ctx.clearRect(0, 0, canvasElement.width, canvasElement.height);
но это не работает, я получаю, когда я меняю данные, щелкая по фильтру, новый слой отображается, как ожидалось, но старый слой остается застрявшим, и я не могу его переместить
видимо мне нужно что-то удалить старый SVG
Прикрепил копию отчета, обратите внимание, при фильтрации предыдущая карта не очищается
http://datastudio.google.com/reporting/df3d5442-12d7-489e-99fe-90031a7ecc9f
спасибо Ральфу Спандлу за помощь, после долгих возни я заставил его работать с
document.body.innerHTML = "";
1 ответ
Каждый раз, когда вы изменяете размер визуального элемента или вносите изменения в настройки, Data Studio вызывает функцию drawViz. Это означает, что каждый раз, когда эта строка вызывается
var canvasElement = document.createElement('canvas');
который в основном создает новый тег холста.
Поэтому вы должны сначала попытаться удалить свой тег холста. Моя рекомендация была бы
document.getElementById("container").remove();
А затем создайте свой холст, как вы уже делаете
var canvasElement = document.createElement('canvas');
canvasElement.id = 'container';
Обратите внимание, что я раскомментировал строку, в которой указан идентификатор вашего тега. Если визуал создается в первый раз, тег с идентификатором "контейнер" не существует, но это не влияет на остальную часть вашего скрипта.
Вы также можете взглянуть на пример Sunburst:
https://github.com/googledatastudio/experimental-visualizations/blob/master/viz/sunburst-drilldown/sunburst/sunburst.js
Функция prepareDOM удаляет все теги и вызывается перед отрисовкой чего-либо еще.