Snap interaction now handle feature without geometry properly

This commit is contained in:
Francois Blackburn
2016-03-15 10:33:38 -04:00
parent ed6ac93222
commit 9186d1fbda
2 changed files with 46 additions and 19 deletions

View File

@@ -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];
}
};

View File

@@ -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]);
});
});
});