已解决,原因在于小程序运行后,先进入渲染wxs,然后才onLoad,那时候wxs的数据为空。解决方法为在map加if,当数据全部加载完成后,if为真显示地图。 [代码]<[代码][代码]block[代码] [代码]wx:if[代码][代码]=[代码][代码]"{{map_is_show}}"[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]map[代码][代码] [代码][代码]class[代码][代码]=[代码][代码]'map'[代码] [代码]id[代码][代码]=[代码][代码]'map'[代码] [代码]bindmarkertap[代码][代码]=[代码][代码]'bind_mkr_tap'[代码] [代码]bindcallouttap[代码][代码]=[代码][代码]'bind_mkr_callout_tap'[代码] [代码]bindtap[代码][代码]=[代码][代码]'bind_map_tap'[代码] [代码]longitude[代码][代码]=[代码][代码]"{{longitude}}"[代码] [代码]latitude[代码][代码]=[代码][代码]"{{latitude}}"[代码] [代码]markers[代码][代码]=[代码][代码]"{{map_make.makes(make_map)}}"[代码] [代码]style[代码][代码]=[代码][代码]"height:{{map_height}}px;"[代码] [代码]show-location>[代码][代码] [代码][代码]</[代码][代码]map[代码][代码]>[代码][代码]</[代码][代码]block[代码][代码]>[代码][代码]that.setData({ map_is_show: [代码][代码]false[代码] [代码]})[代码][代码] [代码][代码]for[代码] [代码](let i = [代码][代码]0[代码][代码]; i < [代码][代码]2[代码][代码]; i++) {[代码][代码] [代码][代码]let pr = [代码][代码]"make_map["[代码] [代码]+ i + [代码][代码]"]"[代码][代码] [代码][代码]that.setData({ [pr]: that.data.make_map[i] })[代码][代码] [代码][代码]}[代码][代码] [代码][代码]that.setData({ map_is_show: [代码][代码]true[代码] [代码]})[代码]现在的问题是:当make_map中的数据发生改变时,如果不控制map_is_show隐藏再显示,map中的markers不会自动更新,哪位有更好的方法吗?这样显隐会重新加载地图,影响体验。
关于map组件设置markers的问题- 需求的场景描述(希望解决的问题) [代码]<[代码][代码]map[代码] [代码]class[代码][代码]=[代码][代码]'map'[代码] [代码]id[代码][代码]=[代码][代码]'map'[代码] [代码]bindmarkertap[代码][代码]=[代码][代码]'bind_mkr_tap'[代码] [代码]bindcallouttap[代码][代码]=[代码][代码]'bind_mkr_callout_tap'[代码] [代码]bindtap[代码][代码]=[代码][代码]'bind_map_tap'[代码] [代码]longitude[代码][代码]=[代码][代码]"{{longitude}}"[代码] [代码]latitude[代码][代码]=[代码][代码]"{{latitude}}"[代码] [代码]markers[代码][代码]=[代码][代码]"{{markers}}"[代码] [代码]style[代码][代码]=[代码][代码]"height:{{map_height}}px;"[代码] [代码]show-location>[代码]</map> [代码][代码][代码]//获取点数据[代码][代码] [代码][代码]wx.request({[代码][代码] [代码][代码]url: getApp().data.net_config.service.host,[代码][代码] [代码][代码]header: getApp().data.net_config.service.header,[代码][代码] [代码][代码]method: [代码][代码]'POST'[代码][代码],[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]'pg'[代码][代码]: [代码][代码]'rcjg'[代码][代码],[代码][代码] [代码][代码]'type'[代码][代码]: [代码][代码]'ini_data'[代码][代码] [代码][代码]},[代码][代码] [代码][代码]success: [代码][代码]function[代码] [代码](res) {[代码] [代码] [代码][代码]if[代码] [代码](getApp().data.util.json_state(res.data.state)) {[代码][代码] [代码][代码]let d = res.data.data[代码] [代码] [代码][代码]var[代码] [代码]index = [代码][代码]0[代码][代码] [代码][代码]for[代码] [代码]([代码][代码]var[代码] [代码]Key [代码][代码]in[代码] [代码]d) {[代码][代码] [代码][代码]//let markers_new = [];[代码][代码] [代码][代码]let g = map.bd09_To_Gcj02(d[Key].lng, d[Key].lat)[代码][代码] [代码][代码]let content = [代码][代码]"档案号:\n\r"[代码] [代码]+ d[Key].dah + [代码][代码]"\n\r店名:\n\r"[代码] [代码]+ d[Key].name[代码] [代码] [代码][代码]let iconPath = map.get_mkr_ico(d[Key].lx);[代码][代码] [代码][代码]//console.log(g)[代码][代码] [代码][代码]let markers_new = {[代码][代码] [代码][代码]id: d[Key].Id,[代码][代码] [代码][代码]mark_index: index,[代码][代码] [代码][代码]dah: d[Key].dah,[代码][代码] [代码][代码]name: d[Key].name,[代码][代码] [代码][代码]lx: d[Key].lx,[代码][代码] [代码][代码]callout: {[代码][代码] [代码][代码]content: content,[代码][代码] [代码][代码]display: [代码][代码]'BYCLICK'[代码][代码],[代码][代码] [代码][代码]textAlign: [代码][代码]'left'[代码][代码],[代码][代码] [代码][代码]borderRadius: [代码][代码]50[代码][代码] [代码][代码]},[代码][代码] [代码][代码]latitude: g[[代码][代码]1[代码][代码]],[代码][代码] [代码][代码]longitude: g[[代码][代码]0[代码][代码]],[代码][代码] [代码][代码]iconPath: iconPath,[代码][代码] [代码][代码]width: [代码][代码]20[代码][代码],[代码][代码] [代码][代码]height: [代码][代码]20[代码][代码] [代码][代码]}[代码][代码] [代码][代码]let pr = [代码][代码]"markers["[代码] [代码]+ index + [代码][代码]"]"[代码][代码] [代码][代码]let pr_list = [代码][代码]"markers_list["[代码] [代码]+ index + [代码][代码]"]"[代码][代码] [代码][代码]console.log(index)[代码][代码] [代码][代码]that.setData({ [pr]: markers_new, [pr_list]: markers_new })[代码][代码] [代码][代码]index++[代码][代码] [代码][代码]}[代码]因为点的数据有3000+条,大小超过了setData的限制,直接用that.setData({ markers: markers_new, markers_list: markers_new })会出问题,所以以上采用按数组一个一个设置。 实际效果是设置一个会全部重新加载一遍点,3000个点耗时1小时都还没完全加载。 换一个思路,将获取到的数据以1000个为一组进行分组,然后通过wxs进行组合,如下: [代码]//获取点数据[代码][代码] [代码][代码]wx.request({[代码][代码] [代码][代码]url: getApp().data.net_config.service.host,[代码][代码] [代码][代码]header: getApp().data.net_config.service.header,[代码][代码] [代码][代码]method: [代码][代码]'POST'[代码][代码],[代码][代码] [代码][代码]data: {[代码][代码] [代码][代码]'pg'[代码][代码]: [代码][代码]'rcjg'[代码][代码],[代码][代码] [代码][代码]'type'[代码][代码]: [代码][代码]'ini_data'[代码][代码] [代码][代码]},[代码][代码] [代码][代码]success: [代码][代码]function[代码] [代码](res) {[代码] [代码] [代码][代码]if[代码] [代码](getApp().data.util.json_state(res.data.state)) {[代码][代码] [代码][代码]let d = res.data.data[代码][代码] [代码][代码]let d_len =[代码][代码]0[代码][代码] [代码][代码]for[代码] [代码](let ever [代码][代码]in[代码] [代码]d) {[代码][代码]//计算长度[代码][代码] [代码][代码]d_len++;[代码][代码] [代码][代码]}[代码][代码] [代码][代码]let max_make_len = Math.ceil(d[d_len - [代码][代码]1[代码][代码]][[代码][代码]'Id'[代码][代码]] / [代码][代码]1000[代码][代码])[代码][代码] [代码][代码]// console.log(max_make_len)[代码][代码] [代码][代码]for[代码] [代码](let i = [代码][代码]0[代码][代码]; i < max_make_len; i++) {[代码][代码]//分组,防止数组过大[代码][代码] [代码][代码]that.data.make_map.push([])[代码][代码] [代码][代码]}[代码][代码] [代码] [代码] [代码][代码]// console.log(that.data.make_map)[代码][代码] [代码][代码]let index = [代码][代码]0[代码][代码] [代码][代码]for[代码] [代码](let Key [代码][代码]in[代码] [代码]d) {[代码][代码] [代码][代码]let g = map.bd09_To_Gcj02(d[Key].lng, d[Key].lat)[代码][代码] [代码][代码]let content = [代码][代码]"档案号:\n\r"[代码] [代码]+ d[Key].dah + [代码][代码]"\n\r店名:\n\r"[代码] [代码]+ d[Key].name[代码][代码] [代码][代码]let make_index = Math.ceil(Key / [代码][代码]1000[代码][代码])-[代码][代码]1[代码][代码] [代码][代码]let iconPath = map.get_mkr_ico(d[Key].lx);[代码][代码] [代码][代码]// console.log(make_index)[代码][代码] [代码][代码]let new_make = {[代码][代码] [代码][代码]id: d[Key].Id,[代码][代码] [代码][代码]mark_index: index,[代码][代码] [代码][代码]dah: d[Key].dah,[代码][代码] [代码][代码]name: d[Key].name,[代码][代码] [代码][代码]lx: d[Key].lx,[代码][代码] [代码][代码]callout: {[代码][代码] [代码][代码]content: content,[代码][代码] [代码][代码]display: [代码][代码]'BYCLICK'[代码][代码],[代码][代码] [代码][代码]textAlign: [代码][代码]'left'[代码][代码],[代码][代码] [代码][代码]borderRadius: [代码][代码]50[代码][代码] [代码][代码]},[代码][代码] [代码][代码]latitude: g[[代码][代码]1[代码][代码]],[代码][代码] [代码][代码]longitude: g[[代码][代码]0[代码][代码]],[代码][代码] [代码][代码]iconPath: iconPath,[代码][代码] [代码][代码]width: [代码][代码]20[代码][代码],[代码][代码] [代码][代码]height: [代码][代码]20[代码][代码] [代码][代码]}[代码][代码] [代码][代码]that.data.make_map[make_index].push(new_make)[代码] [代码] [代码][代码]index++[代码][代码] [代码][代码]}[代码][代码] [代码] [代码] [代码][代码]for[代码] [代码](let i = [代码][代码]0[代码][代码]; i < max_make_len;i++) {[代码][代码] [代码][代码]let pr = [代码][代码]"make_map["[代码] [代码]+ i + [代码][代码]"]"[代码][代码] [代码][代码]console.log(pr)[代码][代码] [代码][代码]that.setData({ [pr]: that.data.make_map[i] })[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码] [代码][代码]})[代码][代码]<[代码][代码]wxs[代码] [代码]module[代码][代码]=[代码][代码]"map_make"[代码][代码]>[代码][代码]var make = function (d) {[代码][代码] [代码][代码]var make = [][代码][代码] [代码][代码]d.forEach(function (item, index) {[代码][代码] [代码][代码]make = make.concat(item)[代码][代码] [代码][代码]})[代码][代码] [代码][代码]return make[代码][代码]}[代码][代码]module.exports = {[代码][代码] [代码][代码]makes: make[代码][代码]};[代码][代码]</[代码][代码]wxs[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]map[代码] [代码]wx:if[代码][代码]=[代码][代码]"{{true}}"[代码] [代码]class[代码][代码]=[代码][代码]'map'[代码] [代码]id[代码][代码]=[代码][代码]'map'[代码] [代码]bindmarkertap[代码][代码]=[代码][代码]'bind_mkr_tap'[代码] [代码]bindcallouttap[代码][代码]=[代码][代码]'bind_mkr_callout_tap'[代码] [代码]bindtap[代码][代码]=[代码][代码]'bind_map_tap'[代码] [代码]longitude[代码][代码]=[代码][代码]"{{longitude}}"[代码] [代码]latitude[代码][代码]=[代码][代码]"{{latitude}}"[代码] [代码]markers[代码][代码]=[代码][代码]"{{map_make.makes(make_map)}}"[代码] [代码]style[代码][代码]=[代码][代码]"height:{{map_height}}px;"[代码] [代码]show-location>[代码]</map> [代码][代码][代码] [代码]然而markers加载不出来,经for测试,数据没有问题。 [代码]<[代码][代码]block[代码] [代码]wx:if[代码][代码]=[代码][代码]"{{true}}"[代码] [代码]wx:for[代码][代码]=[代码][代码]"{{map_make.makes(make_map)}}"[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]view[代码][代码]> {{index}}: </[代码][代码]view[代码][代码]>[代码][代码] [代码][代码]<[代码][代码]view[代码][代码]> {{item.dah}} </[代码][代码]view[代码][代码]>[代码][代码]</[代码][代码]block[代码][代码]>[代码]- 希望提供的能力 1、多个markers数组可以直接组合。 2、setData能接收更多数据。 3、setData设置一个开关函数,全部赋值后,统一更新。 本人水平有限,如有解决办法,欢迎各位大大指正。
2018-07-21