diff --git a/src/ol/map.js b/src/ol/map.js
index 91ef5674ee..fe14b3aed9 100644
--- a/src/ol/map.js
+++ b/src/ol/map.js
@@ -216,6 +216,12 @@ ol.Map = function(options) {
*/
this.viewPropertyListenerKey_ = null;
+ /**
+ * @private
+ * @type {?ol.EventsKey}
+ */
+ this.viewChangeListenerKey_ = null;
+
/**
* @private
* @type {Array.
}
@@ -1102,11 +1108,18 @@ ol.Map.prototype.handleViewChanged_ = function() {
ol.events.unlistenByKey(this.viewPropertyListenerKey_);
this.viewPropertyListenerKey_ = null;
}
+ if (this.viewChangeListenerKey_) {
+ ol.events.unlistenByKey(this.viewChangeListenerKey_);
+ this.viewChangeListenerKey_ = null;
+ }
var view = this.getView();
if (view) {
this.viewPropertyListenerKey_ = ol.events.listen(
view, ol.ObjectEventType.PROPERTYCHANGE,
this.handleViewPropertyChanged_, this);
+ this.viewChangeListenerKey_ = ol.events.listen(
+ view, ol.events.EventType.CHANGE,
+ this.handleViewPropertyChanged_, this);
}
this.render();
};
@@ -1221,7 +1234,6 @@ ol.Map.prototype.removeOverlay = function(overlay) {
* @private
*/
ol.Map.prototype.renderFrame_ = function(time) {
-
var i, ii, viewState;
var size = this.getSize();
diff --git a/test/spec/ol/map.test.js b/test/spec/ol/map.test.js
index f92a44b6e2..f2cc852f38 100644
--- a/test/spec/ol/map.test.js
+++ b/test/spec/ol/map.test.js
@@ -160,6 +160,23 @@ describe('ol.Map', function() {
document.body.removeChild(target);
});
+ it('is called when the view.changed() is called', function() {
+ var view = map.getView();
+
+ var spy = sinon.spy(map, 'render');
+ view.changed();
+ expect(spy.callCount).to.be(1);
+ });
+
+ it('is not called on view changes after the view has been removed', function() {
+ var view = map.getView();
+ map.setView(null);
+
+ var spy = sinon.spy(map, 'render');
+ view.changed();
+ expect(spy.callCount).to.be(0);
+ });
+
it('calls renderFrame_ and results in an postrender event', function(done) {
var spy = sinon.spy(map, 'renderFrame_');