mapbox/mapbox-gl-js

Expose a "statechange" event on GeolocateControl

开放

#5,136 创建于 2017年8月11日

 (0 条评论) (2 个反应) (0 位负责人)JavaScript (2,203 个派生)batch import
feature :green_apple:good first issue

仓库指标

星标
 (10,532 个星标)
PR 合并指标
 (PR 指标待抓取)

描述

Motivation

Discussion started here: https://github.com/mapbox/mapbox-gl-js/pull/4479#issuecomment-321203924

The GeolocateControl doesn't expose events necessary to act on all of its states. trackuserlocationstart and trackuserlocationend aren't enough to detect some user actions. For instance, it's impossible to know if the user toggled off tracking.

To achieve this I currently have to use a MutationObserver on the .mapboxgl-ctrl-geolocate watching for classList changes.

Design

Fire a new statechange event on every _watchState change and pass along its value.

Implementation

Replace all this._watchState = ... with:

_setState(state) => {
  if (this._watchState !== state) {
    this._watchState = state
    this.fire('statechange', state)

    // ... conditions logic to fire trackuserlocationstart and trackuserlocationend
  
    // bonus?
    this._updateUI(state) // centralize the different classList updates spread in _onSucces, _onError, _onClick...
  }
}

贡献者指南