在 vega-lite 中实现自定义点击处理程序的正确方法是什么
What's the proper way to implement a custom click handler in vega-lite
我似乎无法通过阅读文档来解决这个问题。
有没有办法为我的任何标记实施 onClick
事件处理程序?
由于 Vega-Lite 尚不支持信号,您可以修补生成的 Vega。您可以向已编译的 Vega 规范添加信号,然后通过 Vega 视图添加信号侦听器 API。您可以使用 Vega-Embed 中的 patch
选项修补生成的 Vega。
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
<script src="https://cdn.jsdelivr.net/npm/vega-lite@3"></script>
<script src="https://cdn.jsdelivr.net/npm/vega-embed@4"></script>
</head>
<body>
<div id="vis"></div>
<script>
const spec = {
"$schema": "https://vega.github.io/schema/vega-lite/v3.json",
"data": {
"values": [
{"a": "A", "b": 28},
{"a": "B", "b": 55},
{"a": "C", "b": 43},
{"a": "D", "b": 91},
{"a": "E", "b": 81},
{"a": "F", "b": 53},
{"a": "G", "b": 19},
{"a": "H", "b": 87},
{"a": "I", "b": 52}
]
},
"mark": "bar",
"encoding": {
"x": {"field": "a", "type": "ordinal"},
"y": {"field": "b", "type": "quantitative"}
}
};
vegaEmbed('#vis', spec, {
patch: (spec) => {
spec.signals.push({
"name": "barClick",
"value": 0,
"on": [{"events": "rect:mousedown", "update": "barClick + 1"}]
})
return spec;
}
}).then(result => {
result.view.addSignalListener('barClick', console.log);
}).catch(console.warn);
</script>
</body>
我很难用 vega-lite 获得补丁来识别我想要点击事件的对象。因此,我只是添加了一个通用的 eventListener
vegaEmbed('#vis', spec, {}
).then(result => {
result.view.addEventListener('click', function(event, item) {
console.log('CLICK', event, item);
});
}).catch(console.warn);
项目对象包含数据。如果没有数据,您就知道点击的位置不对。
https://vega.github.io/vega/docs/api/view/#view_addEventListener
我似乎无法通过阅读文档来解决这个问题。
有没有办法为我的任何标记实施 onClick
事件处理程序?
由于 Vega-Lite 尚不支持信号,您可以修补生成的 Vega。您可以向已编译的 Vega 规范添加信号,然后通过 Vega 视图添加信号侦听器 API。您可以使用 Vega-Embed 中的 patch
选项修补生成的 Vega。
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
<script src="https://cdn.jsdelivr.net/npm/vega-lite@3"></script>
<script src="https://cdn.jsdelivr.net/npm/vega-embed@4"></script>
</head>
<body>
<div id="vis"></div>
<script>
const spec = {
"$schema": "https://vega.github.io/schema/vega-lite/v3.json",
"data": {
"values": [
{"a": "A", "b": 28},
{"a": "B", "b": 55},
{"a": "C", "b": 43},
{"a": "D", "b": 91},
{"a": "E", "b": 81},
{"a": "F", "b": 53},
{"a": "G", "b": 19},
{"a": "H", "b": 87},
{"a": "I", "b": 52}
]
},
"mark": "bar",
"encoding": {
"x": {"field": "a", "type": "ordinal"},
"y": {"field": "b", "type": "quantitative"}
}
};
vegaEmbed('#vis', spec, {
patch: (spec) => {
spec.signals.push({
"name": "barClick",
"value": 0,
"on": [{"events": "rect:mousedown", "update": "barClick + 1"}]
})
return spec;
}
}).then(result => {
result.view.addSignalListener('barClick', console.log);
}).catch(console.warn);
</script>
</body>
我很难用 vega-lite 获得补丁来识别我想要点击事件的对象。因此,我只是添加了一个通用的 eventListener
vegaEmbed('#vis', spec, {}
).then(result => {
result.view.addEventListener('click', function(event, item) {
console.log('CLICK', event, item);
});
}).catch(console.warn);
项目对象包含数据。如果没有数据,您就知道点击的位置不对。
https://vega.github.io/vega/docs/api/view/#view_addEventListener