diff --git a/src/ol/interaction/snapinteraction.js b/src/ol/interaction/snapinteraction.js index 3a95011202..b273256ab2 100644 --- a/src/ol/interaction/snapinteraction.js +++ b/src/ol/interaction/snapinteraction.js @@ -172,26 +172,31 @@ goog.inherits(ol.interaction.Snap, ol.interaction.Pointer); */ ol.interaction.Snap.prototype.addFeature = function(feature, opt_listen) { var listen = opt_listen !== undefined ? opt_listen : true; + var feature_uid = goog.getUid(feature); var geometry = feature.getGeometry(); - var segmentWriter = this.SEGMENT_WRITERS_[geometry.getType()]; - if (segmentWriter) { - var feature_uid = goog.getUid(feature); - this.indexedFeaturesExtents_[feature_uid] = geometry.getExtent( - ol.extent.createEmpty()); - segmentWriter.call(this, feature, geometry); + if (geometry) { + var segmentWriter = this.SEGMENT_WRITERS_[geometry.getType()]; + if (segmentWriter) { + this.indexedFeaturesExtents_[feature_uid] = geometry.getExtent( + ol.extent.createEmpty()); + segmentWriter.call(this, feature, geometry); - if (listen) { - this.geometryModifyListenerKeys_[feature_uid] = ol.events.listen( - geometry, - ol.events.EventType.CHANGE, - this.handleGeometryModify_.bind(this, feature), - this); - this.geometryChangeListenerKeys_[feature_uid] = ol.events.listen( - feature, - ol.Object.getChangeEventType(feature.getGeometryName()), - this.handleGeometryChange_, this); + if (listen) { + this.geometryModifyListenerKeys_[feature_uid] = ol.events.listen( + geometry, + ol.events.EventType.CHANGE, + this.handleGeometryModify_.bind(this, feature), + this); + } } } + + if (listen) { + this.geometryChangeListenerKeys_[feature_uid] = ol.events.listen( + feature, + ol.Object.getChangeEventType(feature.getGeometryName()), + this.handleGeometryChange_, this); + } }; @@ -317,11 +322,13 @@ ol.interaction.Snap.prototype.removeFeature = function(feature, opt_unlisten) { if (unlisten) { ol.Observable.unByKey(this.geometryModifyListenerKeys_[feature_uid]); delete this.geometryModifyListenerKeys_[feature_uid]; - - ol.Observable.unByKey(this.geometryChangeListenerKeys_[feature_uid]); - delete this.geometryChangeListenerKeys_[feature_uid]; } } + + if (unlisten) { + ol.Observable.unByKey(this.geometryChangeListenerKeys_[feature_uid]); + delete this.geometryChangeListenerKeys_[feature_uid]; + } }; diff --git a/test/spec/ol/interaction/snapinteraction.test.js b/test/spec/ol/interaction/snapinteraction.test.js index 0b2b7fa07a..095418ab90 100644 --- a/test/spec/ol/interaction/snapinteraction.test.js +++ b/test/spec/ol/interaction/snapinteraction.test.js @@ -100,6 +100,26 @@ describe('ol.interaction.Snap', function() { expect(event.coordinate).to.eql([10, 0]); }); + it('handle feature without geometry', function() { + var feature = new ol.Feature(); + var snapInteraction = new ol.interaction.Snap({ + features: new ol.Collection([feature]), + pixelTolerance: 5, + edge: false + }); + snapInteraction.setMap(map); + + feature.setGeometry(new ol.geom.LineString([[-10, 0], [10, 0]])); + + var event = { + pixel: [7 + width / 2, height / 2 - 4], + coorinate: [7, 4], + map: map + }; + ol.interaction.Snap.handleEvent_.call(snapInteraction, event); + expect(event.coordinate).to.eql([10, 0]); + }); + }); });