Skip to content

Commit d534f21

Browse files
Fix event order when dynamically add/remove controllers (visgl#5852)
1 parent f39ac34 commit d534f21

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

modules/core/src/lib/view-manager.js

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -295,19 +295,26 @@ export default class ViewManager {
295295
this._viewports = [];
296296
this.controllers = {};
297297

298+
let invalidateControllers = false;
298299
// Create controllers in reverse order, so that views on top receive events first
299300
for (let i = views.length; i--; ) {
300301
const view = views[i];
301302
const viewState = this.getViewState(view);
302303
const viewport = view.makeViewport({width, height, viewState});
303304

305+
let oldController = oldControllers[view.id];
306+
if (!oldController) {
307+
// When a new controller is added, invalidate all controllers below it so that
308+
// events are registered in the correct order
309+
invalidateControllers = true;
310+
} else if (invalidateControllers) {
311+
// Remove and reattach invalidated controller
312+
oldController.finalize();
313+
oldController = null;
314+
}
315+
304316
// Update the controller
305-
this.controllers[view.id] = this._updateController(
306-
view,
307-
viewState,
308-
viewport,
309-
oldControllers[view.id]
310-
);
317+
this.controllers[view.id] = this._updateController(view, viewState, viewport, oldController);
311318

312319
this._viewports.unshift(viewport);
313320
}

0 commit comments

Comments
 (0)