diff --git a/modules/core/src/lib/view-manager.ts b/modules/core/src/lib/view-manager.ts index 3b232270c2c..6fa3598ffd4 100644 --- a/modules/core/src/lib/view-manager.ts +++ b/modules/core/src/lib/view-manager.ts @@ -326,8 +326,9 @@ export default class ViewManager { height: viewport.height }; - // TODO - check if view / controller type has changed, and replace the controller - if (!controller) { + // Create controller if not already existing or if the type of the + // controller has changed. + if (!controller || controller.constructor !== view.ControllerType) { controller = this._createController(view, resolvedProps); } if (controller) { diff --git a/test/modules/core/views/view-manager.spec.js b/test/modules/core/views/view-manager.spec.js index 46fff15b20d..869b73d8c94 100644 --- a/test/modules/core/views/view-manager.spec.js +++ b/test/modules/core/views/view-manager.spec.js @@ -1,6 +1,6 @@ import test from 'tape-promise/tape'; import ViewManager from '@deck.gl/core/lib/view-manager'; -import {MapView, Viewport} from 'deck.gl'; +import {OrbitController, OrbitView, MapController, MapView, Viewport} from 'deck.gl'; const INITIAL_VIEW_STATE = {latitude: 0, longitude: 0, zoom: 1}; @@ -75,3 +75,33 @@ test('ViewManager#needsRedraw', t => { t.end(); }); + +test('ViewManager#updateController', t => { + const viewManager = new ViewManager({}); + + const mapView = new MapView({id: 'test', height: '100%', controller: MapController}); + viewManager.setProps({ + views: [mapView], + viewState: INITIAL_VIEW_STATE, + width: 100, + height: 100 + }); + + const mapController = viewManager.controllers['test']; + t.equals(mapController.constructor, MapController, 'Correct controller type'); + + // Replace the MapView with a new OrbitView, given the same id. + const orbitView = new OrbitView({id: 'test', height: '100%', controller: OrbitController}); + viewManager.setProps({ + views: [orbitView], + viewState: INITIAL_VIEW_STATE, + width: 100, + height: 100 + }); + + // Verify that the new view has the correct controller. + const orbitController = viewManager.controllers['test']; + t.equals(orbitController.constructor, OrbitController, 'Correct controller type'); + + t.end(); +});