Circle.vue 4.8 KB

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