概述
Openlayers 中內置了9類控件,這9類控件都是基于Control
類,而Control
類則是繼承于BaseObject
類,如下圖所示:
如上,這9類控件分別是:
Attribution
:屬性控件FullScreen
:全屏控件MousePosition
:鼠標位置控件OverviewMap
:鷹眼控件Rotate
:旋轉控件源碼分析之Openlayers中的Rotate旋轉控件
ScaleLine
:比例尺控件Zoom
:縮放控件,可參考源碼分析之Openlayers中的Zoom縮放控件ZoomSlider
:滑動縮放控件ZoomToExtent
:縮放到指定視圖范圍控件源碼分析之Openlayers中的ZoomToExtent控件
本文主要介紹控件的基類Control
類。
源碼剖析
Control
類的實現如下:
class Control extends BaseObject {constructor(options) {super();const element = options.element;if (element && !options.target && !element.style.pointerEvents) {element.style.pointerEvents = "auto";}this.element = element ? element : null;this.target_ = null;this.map_ = null;this.listenerKeys = [];if (options.render) {this.render = options.render;}if (options.target) {this.setTarget(options.target);}}disposeInternal() {this.element?.remove();super.disposeInternal();}getMap() {return this.map_;}setMap(map) {if (this.map_) {this.element?.remove();}for (let i = 0, ii = this.listenerKeys.length; i < ii; ++i) {unlistenByKey(this.listenerKeys[i]);}this.listenerKeys.length = 0;this.map_ = map;if (map) {const target = this.target_ ?? map.getOverlayContainerStopEvent();target.appendChild(this.element);if (this.render !== VOID) {this.listenerKeys.push(listen(map, MapEventType.POSTRENDER, this.render, this));}map.render();}}render(mapEvent) {}setTarget(target) {this.target_ =typeof target === "string" ? document.getElementById(target) : target;}
}
Control
類的構造函數
Control
類的構造函數接受一個參數對象options
,先是判斷options.element
、!element.style.pointerEvents
以及!options.target
是否存在,若為true
,則修改element
元素的樣式,element
對應的就是控件的HTML Element
;然后初始化this.element
,若options.element
不存在,則this.element
為null
,反之為options.element
;初始化this.target_
和this.map_
為null
;初始化this.listenerKeys
為[]
;最后判斷options.render
是否存在,若存在則覆蓋this.render
方法;判斷options.target
是否存在,若存在,則調用this.setTarget
方法。
Control
類的主要方法
Control
類作為控件基類,它定義的方法很少,主要有如下幾個:
-
setTarget
:接受一個參數target
,若target
是一個字符串,則調用document.getElementById
獲取DOM
節點,否則直接賦值,默認情況下,控件是會添加到overlay container
中,這個方法會改變這個一默認行為 -
getMap
: 獲取this.map_
-
setMap
:Control
類的核心方法,接受一個參數map
對象,若this.map_
存在該控件元素,則移除元素;并且循環遍歷this.listenerKeys
移除注冊的事件監聽,并且清空this.listenerKeys
,設置this.map_
的值;然后判斷參數map
是否存在,若存在,則重新添加控件元素到overlay container
中,然后判斷this.render
是否是空方法,若不為空方法,則調用listen
方法注冊postrender
類型的事件監聽,this.render
方法即為注冊的回調函數,本質上它是子類中定義的一個方法;最后調用map.render
方法。 -
render
方法:空函數,會被Control
的子類覆蓋 -
disposeInternal
方法:清除方法,會移除控件元素,調用父類的disposeInternal
方法移除監聽
總結
本文主要介紹了 Openlayers 中的控件類型分類以及控件基類Control
類的實現。