Merge pull request #10490 from bepremeg/CK-240_RemoveSelectEventHandler
Select style multiple select interactions removed
This commit is contained in:
@@ -167,6 +167,16 @@ class Select extends Interaction {
|
|||||||
|
|
||||||
const options = opt_options ? opt_options : {};
|
const options = opt_options ? opt_options : {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
this.boundAddFeature_ = this.addFeature_.bind(this);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
this.boundRemoveFeature_ = this.removeFeature_.bind(this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @type {import("../events/condition.js").Condition}
|
* @type {import("../events/condition.js").Condition}
|
||||||
@@ -249,10 +259,6 @@ class Select extends Interaction {
|
|||||||
* @type {Object<string, import("../layer/Layer.js").default>}
|
* @type {Object<string, import("../layer/Layer.js").default>}
|
||||||
*/
|
*/
|
||||||
this.featureLayerAssociation_ = {};
|
this.featureLayerAssociation_ = {};
|
||||||
|
|
||||||
const features = this.getFeatures();
|
|
||||||
features.addEventListener(CollectionEventType.ADD, this.addFeature_.bind(this));
|
|
||||||
features.addEventListener(CollectionEventType.REMOVE, this.removeFeature_.bind(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -320,8 +326,16 @@ class Select extends Interaction {
|
|||||||
this.features_.forEach(this.restorePreviousStyle_.bind(this));
|
this.features_.forEach(this.restorePreviousStyle_.bind(this));
|
||||||
}
|
}
|
||||||
super.setMap(map);
|
super.setMap(map);
|
||||||
if (map && this.style_) {
|
if (map) {
|
||||||
this.features_.forEach(this.applySelectedStyle_.bind(this));
|
this.features_.addEventListener(CollectionEventType.ADD, this.boundAddFeature_);
|
||||||
|
this.features_.addEventListener(CollectionEventType.REMOVE, this.boundRemoveFeature_);
|
||||||
|
|
||||||
|
if (this.style_) {
|
||||||
|
this.features_.forEach(this.applySelectedStyle_.bind(this));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.features_.removeEventListener(CollectionEventType.ADD, this.boundAddFeature_);
|
||||||
|
this.features_.removeEventListener(CollectionEventType.REMOVE, this.boundRemoveFeature_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import Interaction from '../../../../src/ol/interaction/Interaction.js';
|
|||||||
import Select from '../../../../src/ol/interaction/Select.js';
|
import Select from '../../../../src/ol/interaction/Select.js';
|
||||||
import VectorLayer from '../../../../src/ol/layer/Vector.js';
|
import VectorLayer from '../../../../src/ol/layer/Vector.js';
|
||||||
import VectorSource from '../../../../src/ol/source/Vector.js';
|
import VectorSource from '../../../../src/ol/source/Vector.js';
|
||||||
|
import Style from '../../../../src/ol/style/Style.js';
|
||||||
|
|
||||||
|
|
||||||
describe('ol.interaction.Select', function() {
|
describe('ol.interaction.Select', function() {
|
||||||
@@ -406,4 +407,53 @@ describe('ol.interaction.Select', function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('clear event listeners on interaction removal', function() {
|
||||||
|
let firstInteraction, secondInteraction, feature;
|
||||||
|
|
||||||
|
beforeEach(function() {
|
||||||
|
feature = source.getFeatures()[3]; // top feature is selected
|
||||||
|
|
||||||
|
const style = new Style({});
|
||||||
|
const features = new Collection();
|
||||||
|
|
||||||
|
firstInteraction = new Select({style, features});
|
||||||
|
secondInteraction = new Select({style, features});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function() {
|
||||||
|
map.removeInteraction(secondInteraction);
|
||||||
|
map.removeInteraction(firstInteraction);
|
||||||
|
});
|
||||||
|
|
||||||
|
// The base case
|
||||||
|
describe('with a single interaction added', function() {
|
||||||
|
it('changes the selected feature once', function() {
|
||||||
|
map.addInteraction(firstInteraction);
|
||||||
|
|
||||||
|
const listenerSpy = sinon.spy();
|
||||||
|
feature.on('change', listenerSpy);
|
||||||
|
|
||||||
|
simulateEvent('singleclick', 10, -20, false);
|
||||||
|
|
||||||
|
expect(listenerSpy.callCount).to.be(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// The "difficult" case. To prevent regression
|
||||||
|
describe('with a replaced interaction', function() {
|
||||||
|
it('changes the selected feature once', function() {
|
||||||
|
map.addInteraction(firstInteraction);
|
||||||
|
map.removeInteraction(firstInteraction);
|
||||||
|
map.addInteraction(secondInteraction);
|
||||||
|
|
||||||
|
const listenerSpy = sinon.spy();
|
||||||
|
feature.on('change', listenerSpy);
|
||||||
|
|
||||||
|
simulateEvent('singleclick', 10, -20, false);
|
||||||
|
|
||||||
|
expect(listenerSpy.callCount).to.be(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user