如何通过 ref 向 Vue 元素添加 onclick 事件?
How do I add an onclick event to a Vue element by ref?
我正在使用 Vue Cesium,并且在从我添加到我的地图的各种 Vue 元素中获得所需的行为时遇到了一些麻烦。具体来说,我想获取元素的 ID(使用 v-for 以编程方式创建)并使用它分派一个动作。我可以向元素添加引用。有没有一种方法可以通过 ref 以编程方式向元素添加 onclick 操作?如果有一种更有机的方式我可以为此使用 Cesium 库,那就更好了。
这是相关元素:
div class="viewer">
<vc-viewer :terrainExaggeration="100" @ready="ready" :camera="camera">
<div v-if="billboards.length > 0" v-for="billboard in billboards">
<vc-entity :ref="billboard.id" @click="selectCommunity(billboard.id)" :position="billboard.position" :billboard="billboard" :description="billboard.description" :id="billboard.id.toString()"> </vc-entity>
</div>
<vc-layer-imagery :alpha="alpha" :brightness="brightness" :contrast="contrast">
<vc-provider-imagery-bingmaps :url="url" :bmKey="bmKey" :mapStyle="mapStyle">
</vc-provider-imagery-bingmaps>
</vc-layer-imagery>
</vc-viewer>
</div>
相当于 click
的铯似乎是 "pick" 事件,令人沮丧的是,VC API 似乎没有暴露该事件。您似乎可以使用 LEFT_CLICK
event on the viewer and use it to find the clicked entity. This SO question 显示了从查看器上的事件定位实体的示例。
通过将上面的两个参考与您的示例结合起来尝试示例实现,这样的事情可能会起作用:
<template>
<vc-viewer :terrainExaggeration="100"
@ready="ready"
:camera="camera"
ref="viewer"
@LEFT_CLICK="onClick"
>
<vc-entity v-for="billboard in billboards"
:ref="billboard.id"
:position="billboard.position"
:billboard="billboard"
:description="billboard.description"
:id="billboard.id.toString()"
/>
<vc-layer-imagery :alpha="alpha" :brightness="brightness" :contrast="contrast">
<vc-provider-imagery-bingmaps :url="url" :bmKey="bmKey" :mapStyle="mapStyle">
</vc-provider-imagery-bingmaps>
</vc-layer-imagery>
</vc-viewer>
</template>
<script>
export default {
// ...ext'g
methods: {
// ...ext'g
onClick (click) {
const viewer = this.$refs.viewer;
const pickedObject = viewer.scene.pick(click.position);
if (Cesium.defined(pickedObject)) {
const entityId = pickedObject.id._id;
this.selectCommunity(entityId);
}
}
}
}
</script>
(完全不相关的注意事项:没有必要将 vc-entity
包裹在 div
中,它 可能 会导致不必要的副作用。)
答案,感谢Zouyaoji, appears here: https://github.com/zouyaoji/vue-cesium/issues/41#issuecomment-563029965。
简而言之,vc-viewer 元素有两个事件可用于此:LEFT_CLICK 和 selectedEntityChanged。
我正在使用 Vue Cesium,并且在从我添加到我的地图的各种 Vue 元素中获得所需的行为时遇到了一些麻烦。具体来说,我想获取元素的 ID(使用 v-for 以编程方式创建)并使用它分派一个动作。我可以向元素添加引用。有没有一种方法可以通过 ref 以编程方式向元素添加 onclick 操作?如果有一种更有机的方式我可以为此使用 Cesium 库,那就更好了。
这是相关元素:
div class="viewer">
<vc-viewer :terrainExaggeration="100" @ready="ready" :camera="camera">
<div v-if="billboards.length > 0" v-for="billboard in billboards">
<vc-entity :ref="billboard.id" @click="selectCommunity(billboard.id)" :position="billboard.position" :billboard="billboard" :description="billboard.description" :id="billboard.id.toString()"> </vc-entity>
</div>
<vc-layer-imagery :alpha="alpha" :brightness="brightness" :contrast="contrast">
<vc-provider-imagery-bingmaps :url="url" :bmKey="bmKey" :mapStyle="mapStyle">
</vc-provider-imagery-bingmaps>
</vc-layer-imagery>
</vc-viewer>
</div>
相当于 click
的铯似乎是 "pick" 事件,令人沮丧的是,VC API 似乎没有暴露该事件。您似乎可以使用 LEFT_CLICK
event on the viewer and use it to find the clicked entity. This SO question 显示了从查看器上的事件定位实体的示例。
通过将上面的两个参考与您的示例结合起来尝试示例实现,这样的事情可能会起作用:
<template>
<vc-viewer :terrainExaggeration="100"
@ready="ready"
:camera="camera"
ref="viewer"
@LEFT_CLICK="onClick"
>
<vc-entity v-for="billboard in billboards"
:ref="billboard.id"
:position="billboard.position"
:billboard="billboard"
:description="billboard.description"
:id="billboard.id.toString()"
/>
<vc-layer-imagery :alpha="alpha" :brightness="brightness" :contrast="contrast">
<vc-provider-imagery-bingmaps :url="url" :bmKey="bmKey" :mapStyle="mapStyle">
</vc-provider-imagery-bingmaps>
</vc-layer-imagery>
</vc-viewer>
</template>
<script>
export default {
// ...ext'g
methods: {
// ...ext'g
onClick (click) {
const viewer = this.$refs.viewer;
const pickedObject = viewer.scene.pick(click.position);
if (Cesium.defined(pickedObject)) {
const entityId = pickedObject.id._id;
this.selectCommunity(entityId);
}
}
}
}
</script>
(完全不相关的注意事项:没有必要将 vc-entity
包裹在 div
中,它 可能 会导致不必要的副作用。)
答案,感谢Zouyaoji, appears here: https://github.com/zouyaoji/vue-cesium/issues/41#issuecomment-563029965。
简而言之,vc-viewer 元素有两个事件可用于此:LEFT_CLICK 和 selectedEntityChanged。