Merge pull request #12917 from mike-000/removeFeature-2

Make removeFeature consistent with other remove methods
This commit is contained in:
Tim Schaub
2021-10-27 14:20:10 -06:00
committed by GitHub
2 changed files with 32 additions and 4 deletions

View File

@@ -544,7 +544,10 @@ class VectorSource extends Source {
} }
} else { } else {
if (this.featuresRtree_) { if (this.featuresRtree_) {
this.featuresRtree_.forEach(this.removeFeatureInternal.bind(this)); const removeAndIgnoreReturn = function (feature) {
this.removeFeatureInternal(feature);
}.bind(this);
this.featuresRtree_.forEach(removeAndIgnoreReturn);
for (const id in this.nullGeometryFeatures_) { for (const id in this.nullGeometryFeatures_) {
this.removeFeatureInternal(this.nullGeometryFeatures_[id]); this.removeFeatureInternal(this.nullGeometryFeatures_[id]);
} }
@@ -1019,6 +1022,9 @@ class VectorSource extends Source {
* @api * @api
*/ */
removeFeature(feature) { removeFeature(feature) {
if (!feature) {
return;
}
const featureKey = getUid(feature); const featureKey = getUid(feature);
if (featureKey in this.nullGeometryFeatures_) { if (featureKey in this.nullGeometryFeatures_) {
delete this.nullGeometryFeatures_[featureKey]; delete this.nullGeometryFeatures_[featureKey];
@@ -1027,18 +1033,26 @@ class VectorSource extends Source {
this.featuresRtree_.remove(feature); this.featuresRtree_.remove(feature);
} }
} }
this.removeFeatureInternal(feature); const result = this.removeFeatureInternal(feature);
this.changed(); if (result) {
this.changed();
}
} }
/** /**
* Remove feature without firing a `change` event. * Remove feature without firing a `change` event.
* @param {import("../Feature.js").default<Geometry>} feature Feature. * @param {import("../Feature.js").default<Geometry>} feature Feature.
* @return {import("../Feature.js").default<Geometry>|undefined} The removed feature
* (or undefined if the feature was not found).
* @protected * @protected
*/ */
removeFeatureInternal(feature) { removeFeatureInternal(feature) {
const featureKey = getUid(feature); const featureKey = getUid(feature);
this.featureChangeKeys_[featureKey].forEach(unlistenByKey); const featureChangeKeys = this.featureChangeKeys_[featureKey];
if (!featureChangeKeys) {
return;
}
featureChangeKeys.forEach(unlistenByKey);
delete this.featureChangeKeys_[featureKey]; delete this.featureChangeKeys_[featureKey];
const id = feature.getId(); const id = feature.getId();
if (id !== undefined) { if (id !== undefined) {
@@ -1048,6 +1062,7 @@ class VectorSource extends Source {
this.dispatchEvent( this.dispatchEvent(
new VectorSourceEvent(VectorEventType.REMOVEFEATURE, feature) new VectorSourceEvent(VectorEventType.REMOVEFEATURE, feature)
); );
return feature;
} }
/** /**

View File

@@ -339,6 +339,19 @@ describe('ol.source.Vector', function () {
vectorSource.removeFeature(features[0]); vectorSource.removeFeature(features[0]);
expect(listener.called).to.be(true); expect(listener.called).to.be(true);
}); });
it('accepts features that are not in the source', function () {
const changeListener = sinon.spy();
listen(vectorSource, 'change', changeListener);
const removeFeatureListener = sinon.spy();
listen(vectorSource, 'removefeature', removeFeatureListener);
const feature = new Feature(new Point([0, 0]));
vectorSource.removeFeature(feature);
expect(changeListener.called).to.be(false);
expect(removeFeatureListener.called).to.be(false);
});
}); });
describe("modifying a feature's geometry", function () { describe("modifying a feature's geometry", function () {