OpenLayers 3 modifiziert das Endereignis

9

Ich möchte die Geometriedaten speichern, nachdem ich sie geändert habe. Daher benötige ich ein Ereignis, das nach Abschluss der Änderung ausgelöst wird, um das Feature zu ändern. Ich verwende Folgendes aus diesem Beitrag: Listener ändern Interaktion

    var selected_features = select.getFeatures();
// when a feature is selected...
selected_features.on('add', function (event) {
    // get the feature
    var feature = event.element;
    feature.on("change", function (event) {
            logStatus(feature.getId() + " has been changed!\n");
    });
});

Aber dieser Listener wird in einer einzigen Modifikation zu oft ausgelöst, und wenn ich "einmal" anstelle von "ein" verwende, wird nur die erste kleine Änderung und nicht mehr ausgelöst, sodass die tatsächliche Änderung nicht gespeichert wird. Ich benötige etwas wie "changeend" oder "modifyend", das ausgelöst wird, wenn ich mit dem Ändern der Funktion fertig bin. Was kann ich verwenden?

Jordan
quelle
2
Dies ist eine bekannte Einschränkung. Dafür wurde kürzlich ein GitHub-Problem erstellt: github.com/openlayers/ol3/issues/2946 .
Erilem

Antworten:

10

Wenn Sie ein Änderungsereignis benötigen, warum verwenden Sie es nicht in der Änderungsinteraktion (ich denke, Sie verwenden eine Änderungsinteraktion), überprüfen Sie dies

modify.on('modifyend',function(e){
console.log("feature id is",e.features.getArray()[0].getId());
});

Diese Veranstaltung ist in den neuesten Versionen von ol3 verfügbar. In meinem Code-Snip gehe ich davon aus, dass Sie nur eine Fetaure gleichzeitig ändern (getArray () [0]). Wenn Sie mehr als eine Fetaure gleichzeitig ändern, rufen Sie das Fetaures-Array ab und fügen Sie eine Schleife zur weiteren Bearbeitung hinzu. Wie so:

modify.on('modifyend',function(e){
var features = e.features.getArray();
for (var i=0;i<features.length;i++){
console.log("feature changed id is",features[i].getId());
}
});
pavlos
quelle
5
Sie sollten angeben, dass dies modifyder Name der Interaktion ändern ist und dass Ihr modifyendCode nach dem Definieren der Interaktion kommt: zuerst var modify = new ol.interaction.Modify({ features: select.getFeatures() });und dann Ihr Code. selectist der Name meiner Select Interaction. Auch ein Entwickler kann e.features.getArray()[0].getGeometry().getCoordinates()oder e.features.getArray()[0].getGeometry().getType()um die Koordinaten oder den Typ zu bekommen. Trotzdem eine nette Antwort, Alter.
Slevin
3
Vielleicht mache ich etwas falsch, aber mit OL5 scheint es, dass e.features.getArray()[0].getId())immer die gleiche ID zurückgegeben wird, unabhängig davon, welche Funktion ich ändere . Gibt es eine andere Möglichkeit, um festzustellen, welche Funktion geändert wurde?
Félix Gagnon-Grenier