Render map when layer.setMap(map) called

This commit is contained in:
Éric Lemoine
2015-08-19 14:16:48 +02:00
parent 33da0e7b66
commit b1973fcdf4
2 changed files with 52 additions and 22 deletions

View File

@@ -161,8 +161,12 @@ ol.layer.Layer.prototype.handleSourcePropertyChange_ = function() {
*/
ol.layer.Layer.prototype.setMap = function(map) {
goog.events.unlistenByKey(this.mapPrecomposeKey_);
this.changed();
this.mapPrecomposeKey_ = null;
if (goog.isNull(map)) {
this.changed();
}
goog.events.unlistenByKey(this.mapRenderKey_);
this.mapRenderKey_ = null;
if (!goog.isNull(map)) {
this.mapPrecomposeKey_ = goog.events.listen(
map, ol.render.EventType.PRECOMPOSE, function(evt) {
@@ -173,6 +177,7 @@ ol.layer.Layer.prototype.setMap = function(map) {
}, false, this);
this.mapRenderKey_ = goog.events.listen(
this, goog.events.EventType.CHANGE, map.render, false, map);
this.changed();
}
};

View File

@@ -578,30 +578,55 @@ describe('ol.layer.Layer', function() {
});
describe('As overlay', function() {
describe('#setMap (unmanaged layer)', function() {
var map;
it('overlays the layer on the map', function() {
var map = new ol.Map({});
var layer = new ol.layer.Layer({
map: map
beforeEach(function() {
map = new ol.Map({});
});
describe('with map in constructor options', function() {
it('renders the layer', function() {
var layer = new ol.layer.Layer({
map: map
});
var frameState = {
layerStatesArray: [],
layerStates: {}
};
map.dispatchEvent(new ol.render.Event('precompose', map, null,
frameState, null, null));
expect(frameState.layerStatesArray.length).to.be(1);
var layerState = frameState.layerStatesArray[0];
expect(layerState.layer).to.equal(layer);
expect(frameState.layerStates[goog.getUid(layer)]).to.equal(layerState);
});
});
describe('setMap sequences', function() {
var mapRenderSpy;
beforeEach(function() {
mapRenderSpy = sinon.spy(map, 'render');
});
afterEach(function() {
mapRenderSpy.restore();
});
it('requests a render frame', function() {
var layer = new ol.layer.Layer({});
layer.setMap(map);
expect(mapRenderSpy.callCount).to.be(1);
layer.setMap(null);
expect(mapRenderSpy.callCount).to.be(2);
layer.setMap(map);
expect(mapRenderSpy.callCount).to.be(3);
});
var frameState = {
layerStatesArray: [],
layerStates: {}
};
map.dispatchEvent(new ol.render.Event('precompose', map, null,
frameState, null, null));
expect(frameState.layerStatesArray.length).to.be(1);
var layerState = frameState.layerStatesArray[0];
expect(layerState.layer).to.equal(layer);
expect(frameState.layerStates[goog.getUid(layer)]).to.equal(layerState);
frameState.layerStatesArray = [];
frameState.layerStates = {};
layer.setMap(null);
map.dispatchEvent(new ol.render.Event('precompose', map, null,
frameState, null, null));
expect(frameState.layerStatesArray.length).to.be(0);
});
});