Ich habe eine OpenLayers 3.2.0-Karte, die einige Vektorquellen ( ol.source.Vector
) und zugehörige Vektorebenen ( ol.layer.Vector
) enthält.
Wenn Features ( ol.Feature
) zu den Vektorquellen hinzugefügt werden, erhalten sie eine data
Eigenschaft, die auf das Javascript-Objekt festgelegt ist, das das Feature darstellt. TypeScript folgt ...
vectorSource.addFeature(new ol.Feature({
geometry: /* ... */,
data: vectorData,
}));
Die Vektorebenen haben dann eine Stilfunktion, die die data
Eigenschaft liest und ihren Stil abruft:
vectorLayer = new ol.layer.Vector({
source: vectorSource,
renderBuffer: /* ... */,
style: function (feature: ol.Feature, resolution: any) {
var data = </* TypeScript Type */>feature.get('data');
if ((data) && (data.style)) {
return [data.style];
}
else {
/* return default style */
}
}
});
Manchmal führen Ereignisse, die nichts mit der Karte zu tun haben, dazu, dass sich die Stile ändern. Wenn ein Objekt beispielsweise ungültig wird, ändert sich sein Stil. Da data.style
ich völlig unter meiner Kontrolle bin, ist es natürlich trivial, sie zu ändern.
Das Problem ist, dass die Karte nicht weiß, dass sich der Stil geändert hat. Wenn ich den Stil eines Objekts ändere und dann die Karte zoome und sie zum Neuzeichnen zwinge, stelle ich fest, dass meine Stilfunktionen ausgeführt werden und den neuen Stil zurückgeben und das Feature neu gezeichnet wird. Wie erzwinge ich programmgesteuert eine Aktualisierung der Karte?
Nach einigem Suchen und Experimentieren habe ich versucht:
- Der Aufruf
render()
auf derol.Map
selbst. - Aufruf
dispatchChangeEvent()
an dieol.source.Vector
- Aufruf
redraw()
an dieol.layer.Vector
Diese wurden vorgeschlagen, aber keine davon hat funktioniert, was nicht verwunderlich ist, da nur die erste Methode in der OpenLayers 3.2.0-API-Dokumentation aufgeführt ist und nicht als stabil markiert ist.