Ereignisse

Ereignisse teilen Ihrer Seite mit, was in der Karte passiert. Sie sind Opt-in: Die Karte sendet nichts, bis Sie ein Abonnement einrichten. Eine Einbettung, die nur eine Karte anzeigt, verursacht also keinen Mehraufwand.

Abonnieren

const stop = map.on("viewChanged", (view) => { /* ... */ });
stop();                        // remove this handler
map.off("viewChanged");        // remove every handler for the event

Sie können abonnieren, bevor die Karte bereit ist, und Ereignisse schon beim Einbinden angeben, damit beim Start nichts verloren geht:

embed(el, { publishId, events: ["rendered", "featureClick"] });

Abonnements bleiben über map.reload() hinweg bestehen.

reason: Echo-Schleifen vermeiden

Wenn Ihre Seite und die Karte einander spiegeln (eine Liste, die der Karte folgt, eine URL, die die Ansicht speichert), kommt jeder Ihrer eigenen Befehle als Ereignis zu Ihnen zurück. Ohne Vorsicht entsteht eine Schleife.

Jedes Zustandsereignis sagt deshalb, warum es eingetreten ist:

reason Bedeutung
user Der Betrachter hat es getan: gezogen, geklickt, ein Bedienelement in der Karte benutzt
command Ihre Seite hat es über die API getan
bookmark Ein Lesezeichen wurde angewendet
tour Eine laufende Tour hat es getan
scene applyScene hat es getan
load Anfangszustand beim Start der Karte

Eine Synchronisierung in beide Richtungen ist damit eine einzige Zeile:

map.on("viewChanged", (v) => { if (v.reason === "user") writeViewToUrl(v); });

Die Ereignisse, die Sie am häufigsten verwenden

viewChanged

Wird ausgelöst, wenn die Kamera zur Ruhe kommt, mit derselben Form, die getView() liefert, plus reason. Standardmäßig erhalten Sie ein Ereignis pro Geste, höchstens alle 200 ms. Beides lässt sich anpassen:

embed(el, { publishId, events: ["viewChanged"], subscribeOptions: { viewChangedThrottleMs: 500 } });
embed(el, { publishId, events: ["viewChanged"], subscribeOptions: { continuousView: true } });   // while moving, too

Die letzte Position kommt immer an, egal wie schnell sich der Betrachter bewegt.

featureClick

map.on("featureClick", (f) => {
  if (!f) return closeMyPanel();            // the reader clicked empty map
  // f = { layerId, layerName, featureKey, fields, lngLat }
});

fields enthält die Felder, die die Ebene in ihrer QuickInfo zeigt (also das, was der Betrachter ohnehin sehen kann), und sonst nichts. Wenn Sie eine weitere Spalte zum Verknüpfen benötigen, bitten Sie den Autor der Karte, sie der QuickInfo der Ebene hinzuzufügen. featureKey ist für die Lebensdauer der Veröffentlichung stabil und wird von selectByKey und highlight akzeptiert.

featureHover hat dieselbe Form und ist null, wenn der Zeiger das Feature verlässt. Die Ereignisse folgen im Abstand von mindestens 100 ms; ein Verlassen wird nie verzögert, sodass Sie nie fälschlich annehmen, der Zeiger befinde sich noch über etwas.

selectionChanged, slicerChanged, filtersChanged, visibilityChanged

Jedes davon liefert den neuen Zustand und einen reason. Verwenden Sie sie, um Ihre eigenen Bedienelemente aktuell zu halten, wenn der Betrachter die der Karte benutzt:

map.on("visibilityChanged", ({ visibility }) => {
  for (const [id, on] of Object.entries(visibility.layers ?? {})) myToggles[id].checked = on;
});

linkClicked

Karten können Hyperlinks und Link-Schaltflächen enthalten. Standardmäßig navigiert ein Klick. Um ihn stattdessen in Ihrer Anwendung zu behandeln, legen Sie das Verhalten beim Einbinden fest:

const map = embed(el, { publishId, hyperlinkBehavior: "raiseEvent", events: ["linkClicked"] });
map.on("linkClicked", ({ url, layerId, featureKey, buttonId }) => router.push(toMyRoute(url)));

"navigateAndRaiseEvent" macht beides.

Wird ausgelöst, wenn der Betrachter eine Aktion wählt, die Sie mit addMenuCommand hinzugefügt haben.

analysisResult

Wird ausgelöst, wenn eine Analyseoperation abgeschlossen ist, egal ob Ihre Seite sie ausgeführt hat oder der Betrachter. Siehe Analyse.

loaded, rendered, dataStateChanged

loaded bedeutet, dass die Karte läuft; rendered bedeutet, dass ihr erstes Bild auf dem Bildschirm ist, mit durationMs ab dem Start des Frames. Nützlich für Ihr eigenes Performance-Monitoring. dataStateChanged meldet für Livedaten loading, ready, stale oder error.

tokenExpiring

Wird bei Karten mit Token-Schutz eine Minute vor Ablauf des Einbettungstokens ausgelöst. Antworten Sie mit setToken. Siehe Erste Schritte.

error

Probleme, nachdem die Sitzung geöffnet wurde. Fehler beim Start gehen stattdessen an die Option onError und führen dazu, dass ready abgelehnt wird.

Reihenfolge und verworfene Ereignisse

Jedes Ereignis enthält eine seq, die über die Lebensdauer der Sitzung um jeweils eins steigt. Das SDK kümmert sich darum; relevant ist sie nur, wenn Sie Ereignisse protokollieren und eine Lücke sehen. Das bedeutet, dass eines verworfen wurde. Die Karte verwirft ein Ereignis, statt ein fehlerhaftes zu senden, in genau einem Fall: bei Nutzdaten über 32 KB.

Die Sequenz beginnt neu, wenn der Frame neu geladen wird.

Die vollständige Liste

Jedes Ereignis mit seinem Nutzdatentyp finden Sie in der API-Referenz. Welche Ereignisse die Karte auslösen kann, teilt sie Ihnen außerdem in capabilities.events mit.