Circle.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <script>
  2. import commonMixin from '../base/mixins/common.js'
  3. import bindEvents from '../base/bindEvent.js'
  4. import {createPoint} from '../base/factory.js'
  5. export default {
  6. name: 'bm-circle',
  7. render () {},
  8. mixins: [commonMixin('overlay')],
  9. props: {
  10. center: {
  11. },
  12. radius: {
  13. },
  14. strokeColor: {
  15. type: String
  16. },
  17. strokeWeight: {
  18. type: Number
  19. },
  20. strokeOpacity: {
  21. type: Number
  22. },
  23. strokeStyle: {
  24. type: String
  25. },
  26. fillColor: {
  27. type: String
  28. },
  29. fillOpacity: {
  30. type: Number
  31. },
  32. massClear: {
  33. type: Boolean,
  34. default: true
  35. },
  36. clicking: {
  37. type: Boolean,
  38. default: true
  39. },
  40. editing: {
  41. type: Boolean,
  42. default: false
  43. }
  44. },
  45. watch: {
  46. 'center.lng' (val, oldVal) {
  47. const {BMap, originInstance, isEditing, disableEditing, enableEditing, center, editing} = this
  48. if (!isEditing) {
  49. disableEditing()
  50. const lng = val
  51. if (val.toString() !== oldVal.toString() && lng >= -180 && lng <= 180) {
  52. originInstance.setCenter(createPoint(BMap, {lng, lat: center.lat}))
  53. }
  54. editing && enableEditing()
  55. }
  56. },
  57. 'center.lat' (val, oldVal) {
  58. const {BMap, originInstance, isEditing, disableEditing, enableEditing, center, editing} = this
  59. if (!isEditing) {
  60. disableEditing()
  61. const lat = val
  62. if (val.toString() !== oldVal.toString() && lat >= -74 && lat <= 74) {
  63. originInstance.setCenter(createPoint(BMap, {lng: center.lng, lat}))
  64. }
  65. editing && enableEditing()
  66. }
  67. },
  68. radius (val, oldVal) {
  69. const {originInstance, isEditing, disableEditing, enableEditing, editing} = this
  70. if (!isEditing) {
  71. disableEditing()
  72. originInstance.setRadius(val)
  73. editing && enableEditing()
  74. }
  75. },
  76. strokeColor (val) {
  77. this.originInstance.setStrokeColor(val)
  78. },
  79. strokeOpacity (val) {
  80. this.originInstance.setStrokeOpacity(val)
  81. },
  82. strokeWeight (val) {
  83. this.originInstance.setStrokeWeight(val)
  84. },
  85. strokeStyle (val) {
  86. this.originInstance.setStrokeStyle(val)
  87. },
  88. fillColor (val) {
  89. this.originInstance.setFillColor(val)
  90. },
  91. fillOpacity (val) {
  92. this.originInstance.setFillOpacity(val)
  93. },
  94. editing (val) {
  95. val ? this.enableEditing() : this.disableEditing()
  96. },
  97. massClear (val) {
  98. val ? this.originInstance.enableMassClear() : this.originInstance.disableMassClear()
  99. },
  100. clicking (val) {
  101. this.reload()
  102. }
  103. },
  104. methods: {
  105. dragStartHandler () {
  106. this.isEditing = true
  107. },
  108. dragEndHandler () {
  109. this.isEditing = false
  110. this.bindEditingNodeEvents()
  111. },
  112. bindEditingNodeEvents () {
  113. const {originInstance, editingKey, dragStartHandler, dragEndHandler} = this
  114. originInstance[editingKey].forEach($node => {
  115. $node.addEventListener('dragstart', dragStartHandler)
  116. $node.addEventListener('dragend', dragEndHandler)
  117. })
  118. },
  119. enableEditing () {
  120. const {originInstance, bindEditingNodeEvents} = this
  121. originInstance.enableEditing()
  122. bindEditingNodeEvents()
  123. },
  124. disableEditing () {
  125. const {originInstance} = this
  126. originInstance.disableEditing()
  127. },
  128. getEditingKey (overlay) {
  129. const stack = []
  130. overlay.enableEditing()
  131. setTimeout(() => {
  132. for (const key in overlay) {
  133. if (overlay[key] && overlay[key].length === 2) {
  134. stack.push(key)
  135. }
  136. }
  137. overlay.disableEditing()
  138. for (const key in overlay) {
  139. if (overlay[key] && overlay[key].length === 0 && ~stack.indexOf(key)) {
  140. this.editingKey = key
  141. }
  142. }
  143. }, 0)
  144. },
  145. load () {
  146. const {BMap, map, center, radius, strokeColor, strokeWeight, strokeOpacity, strokeStyle, fillColor, fillOpacity, editing, massClear, clicking, enableEditing, disableEditing, getEditingKey, editingKey} = this
  147. const overlay = new BMap.Circle(createPoint(BMap, {lng: center.lng, lat: center.lat}), radius, {
  148. strokeColor,
  149. strokeWeight,
  150. strokeOpacity,
  151. strokeStyle,
  152. fillColor,
  153. fillOpacity,
  154. // enableEditing: editing,
  155. enableMassClear: massClear,
  156. enableClicking: clicking
  157. })
  158. this.originInstance = overlay
  159. map.addOverlay(overlay)
  160. bindEvents.call(this, overlay)
  161. // 解决圆形组件无法双向绑定的问题
  162. !editingKey && getEditingKey(overlay)
  163. setTimeout(() => {
  164. editing ? enableEditing() : disableEditing()
  165. }, 0)
  166. }
  167. }
  168. }
  169. </script>