diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js index 7720f746c0..98c19d7921 100644 --- a/src/ol/source/vectorsource.js +++ b/src/ol/source/vectorsource.js @@ -28,6 +28,14 @@ ol.source.VectorEventType = { * @api stable */ ADDFEATURE: 'addfeature', + + /** + * Triggered when a feature is updated. + * @event ol.source.VectorEvent#updatefeature + * @api + */ + UPDATEFEATURE: 'updatefeature', + /** * Triggered when a feature is removed from the source. * @event ol.source.VectorEvent#removefeature @@ -437,6 +445,8 @@ ol.source.Vector.prototype.handleFeatureChange_ = function(event) { } } this.changed(); + this.dispatchEvent(new ol.source.VectorEvent( + ol.source.VectorEventType.UPDATEFEATURE, feature)); }; diff --git a/test/spec/ol/source/vectorsource.test.js b/test/spec/ol/source/vectorsource.test.js index a8d513851a..19cd832b7a 100644 --- a/test/spec/ol/source/vectorsource.test.js +++ b/test/spec/ol/source/vectorsource.test.js @@ -242,6 +242,17 @@ describe('ol.source.Vector', function() { expect(listener).to.be.called(); }); + it('fires a updatefeature event when updating a feature', function() { + var feature = new ol.Feature(new ol.geom.Point([1, 1])); + vectorSource.addFeature(feature); + var listener = sinon.spy(function(event) { + expect(event.feature).to.be(feature); + }); + vectorSource.on('updatefeature', listener); + feature.setStyle(null); + expect(listener).to.be.called(); + }); + }); describe('#getFeatureById()', function() {