如何在invalidateViewables()中切换dataVizExtn的不同pointMesh?
解决方案
针对你遇到的多pointMesh刷新问题,这里提供几个可行的解决思路:
1. 直接指定目标pointMesh调用刷新
大多数DataVizExtension的invalidateViewables()方法支持传入自定义的pointMesh数组参数,你可以直接指定要刷新的单个或多个mesh,不用依赖默认的this.pointMeshs:
// 刷新索引为0的pointMesh this.invalidateViewables([this.pointMeshs[0]]); // 刷新索引为1的pointMesh this.invalidateViewables([this.pointMeshs[1]]); // 同时刷新两个 this.invalidateViewables([this.pointMeshs[0], this.pointMeshs[1]]);
2. 重写invalidateViewables方法自定义刷新逻辑
如果默认方法不支持传入参数,你可以重写这个方法,添加参数来指定要刷新的mesh索引或实例:
invalidateViewables(targetMeshs = this.pointMeshs) { // 保留原有刷新逻辑,将遍历对象替换为传入的targetMeshs targetMeshs.forEach(mesh => { // 执行你的刷新操作,比如更新sprite尺寸、重新计算顶点数据等 mesh.invalidate(); // 其他必要的更新逻辑,比如重新绑定数据 mesh.updateData(mesh.data); }); }
调用时就可以灵活指定目标:
// 只刷新第二个mesh this.invalidateViewables([this.pointMeshs[1]]);
3. 独立维护两个ViewableData实例
既然你已经创建了两个ViewableData,建议将它们分别存储,各自管理对应的pointMesh,避免共用全局的this.pointMeshs:
// 初始化时保存两个实例 this.viewableData1 = new ViewableData(...); this.viewableData1.finish(); this.pointMesh1 = this.viewableData1.pointMesh; this.viewableData2 = new ViewableData(...); this.viewableData2.finish(); this.pointMesh2 = this.viewableData2.pointMesh;
需要刷新时直接操作对应实例的pointMesh:
// 刷新第一个尺寸的sprite this.pointMesh1.invalidate(); // 刷新第二个尺寸的sprite this.pointMesh2.invalidate();
这样可以彻底避免多个mesh之间的干扰,每个sprite组的刷新逻辑完全独立。
内容的提问来源于stack exchange,提问作者Tim Huang
相关产品推荐
相关产品推荐

