You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.9 KiB
81 lines
1.9 KiB
const types = {
|
|
control: {
|
|
unload: 'removeControl'
|
|
},
|
|
layer: {
|
|
unload: 'removeTileLayer'
|
|
},
|
|
overlay: {
|
|
unload: 'removeOverlay'
|
|
},
|
|
contextMenu: {
|
|
unload: 'removeContextMenu'
|
|
}
|
|
}
|
|
|
|
const getParent = $component => ($component.abstract || $component.$el === $component.$children[0].$el) ? getParent($component.$parent) : $component
|
|
|
|
function destroyInstance () {
|
|
const {unload, renderByParent, $parent} = this
|
|
if (renderByParent) {
|
|
$parent.reload()
|
|
}
|
|
unload()
|
|
}
|
|
|
|
class Mixin {
|
|
constructor (prop) {
|
|
this.methods = {
|
|
ready () {
|
|
const $parent = getParent(this.$parent)
|
|
const BMap = this.BMap = $parent.BMap
|
|
const map = this.map = $parent.map
|
|
this.load()
|
|
this.$emit('ready', {
|
|
BMap,
|
|
map
|
|
})
|
|
},
|
|
transmitEvent (e) {
|
|
this.$emit(e.type.replace(/^on/, ''), e)
|
|
},
|
|
reload () {
|
|
this && this.BMap && this.$nextTick(() => {
|
|
this.unload()
|
|
this.$nextTick(this.load)
|
|
})
|
|
},
|
|
unload () {
|
|
const {map, originInstance} = this
|
|
try {
|
|
switch (prop.type) {
|
|
case 'search':
|
|
return originInstance.clearResults()
|
|
case 'autoComplete':
|
|
case 'lushu':
|
|
return originInstance.dispose()
|
|
case 'markerClusterer':
|
|
return originInstance.clearMarkers()
|
|
default:
|
|
map[types[prop.type].unload](originInstance)
|
|
}
|
|
} catch (e) {}
|
|
}
|
|
}
|
|
this.computed = {
|
|
renderByParent () {
|
|
return this.$parent.preventChildrenRender
|
|
}
|
|
}
|
|
this.mounted = function () {
|
|
const $parent = getParent(this.$parent)
|
|
const map = $parent.map
|
|
const {ready} = this
|
|
map ? ready() : $parent.$on('ready', ready)
|
|
}
|
|
this.destroyed = destroyInstance
|
|
this.beforeDestroy = destroyInstance
|
|
}
|
|
}
|
|
|
|
export default type => new Mixin({type})
|
|
|