diff --git a/src/ol/feature.js b/src/ol/feature.js index 642b602d80..53cbf4f625 100644 --- a/src/ol/feature.js +++ b/src/ol/feature.js @@ -149,7 +149,6 @@ ol.Feature.prototype.handleGeometryChanged_ = function() { this.geometryChangeKey_ = goog.events.listen(geometry, goog.events.EventType.CHANGE, this.handleGeometryChange_, false, this); } - this.dispatchChangeEvent(); }; diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js index 00f24f8968..da3c2c4847 100644 --- a/src/ol/source/vectorsource.js +++ b/src/ol/source/vectorsource.js @@ -12,6 +12,7 @@ goog.require('goog.events'); goog.require('goog.events.Event'); goog.require('goog.events.EventType'); goog.require('goog.object'); +goog.require('ol.ObjectEventType'); goog.require('ol.source.Source'); goog.require('ol.structs.RBush'); @@ -58,7 +59,7 @@ ol.source.Vector = function(opt_options) { /** * @private - * @type {Object.} + * @type {Object.>} */ this.featureChangeKeys_ = {}; @@ -88,8 +89,14 @@ ol.source.Vector.prototype.addFeature = function(feature) { ol.source.Vector.prototype.addFeatureInternal = function(feature) { var featureKey = goog.getUid(feature).toString(); goog.asserts.assert(!(featureKey in this.featureChangeKeys_)); - this.featureChangeKeys_[featureKey] = goog.events.listen(feature, - goog.events.EventType.CHANGE, this.handleFeatureChange_, false, this); + this.featureChangeKeys_[featureKey] = [ + goog.events.listen(feature, + goog.events.EventType.CHANGE, + this.handleFeatureChange_, false, this), + goog.events.listen(feature, + ol.ObjectEventType.PROPERTYCHANGE, + this.handleFeatureChange_, false, this) + ]; var geometry = feature.getGeometry(); if (goog.isNull(geometry)) { this.nullGeometryFeatures_[goog.getUid(feature).toString()] = feature; @@ -343,7 +350,8 @@ ol.source.Vector.prototype.removeFeature = function(feature) { ol.source.Vector.prototype.removeFeatureInternal = function(feature) { var featureKey = goog.getUid(feature).toString(); goog.asserts.assert(featureKey in this.featureChangeKeys_); - goog.events.unlistenByKey(this.featureChangeKeys_[featureKey]); + goog.array.forEach(this.featureChangeKeys_[featureKey], + goog.events.unlistenByKey); delete this.featureChangeKeys_[featureKey]; this.dispatchEvent(new ol.source.VectorEvent( ol.source.VectorEventType.REMOVEFEATURE, feature)); diff --git a/test/spec/ol/source/vectorsource.test.js b/test/spec/ol/source/vectorsource.test.js index 06bee326b0..0b726799b9 100644 --- a/test/spec/ol/source/vectorsource.test.js +++ b/test/spec/ol/source/vectorsource.test.js @@ -233,6 +233,15 @@ describe('ol.source.Vector', function() { expect(vectorSource.getFeatures()).to.eql([feature]); }); + it('fires a change event when setting a feature\'s property', function() { + var feature = new ol.Feature(new ol.geom.Point([1, 1])); + vectorSource.addFeature(feature); + var listener = sinon.spy(); + goog.events.listen(vectorSource, 'change', listener); + feature.set('foo', 'bar'); + expect(listener).to.be.called(); + }); + }); });