diff --git a/IPython/html/static/widgets/js/manager.js b/IPython/html/static/widgets/js/manager.js index dd3472c..944effd 100644 --- a/IPython/html/static/widgets/js/manager.js +++ b/IPython/html/static/widgets/js/manager.js @@ -188,13 +188,33 @@ define([ WidgetManager.prototype._handle_comm_open = function (comm, msg) { // Handle when a comm is opened. var that = this; - var model_id = comm.comm_id; + + var instantiate_model = function(ModelType) { + var model_id = comm.comm_id; + var widget_model = new ModelType(that, model_id, comm); + widget_model.on('comm:close', function () { + delete that._models[model_id]; + }); + that._models[model_id] = widget_model; + }; + var widget_type_name = msg.content.data.model_name; - var widget_model = new WidgetManager._model_types[widget_type_name](this, model_id, comm); - widget_model.on('comm:close', function () { - delete that._models[model_id]; - }); - this._models[model_id] = widget_model; + var widget_module = msg.content.data.model_module; + + if (widget_module) { + // Load the module containing the widget model + require([widget_module], function(mod) { + if (mod[widget_type_name]) { + instantiate_model(mod[widget_type_name]); + } else { + console.log("Error creating widget model: " + widget_type_name + + " not found in " + widget_module); + } + }, function(err) { console.log(err); }); + } else { + // No module specified, load from the global models registry + instantiate_model(WidgetManager._model_types[widget_type_name]); + } }; // Backwards compatability. diff --git a/IPython/html/widgets/widget.py b/IPython/html/widgets/widget.py index 86e85aa..f1571ea 100644 --- a/IPython/html/widgets/widget.py +++ b/IPython/html/widgets/widget.py @@ -98,6 +98,8 @@ class Widget(LoggingConfigurable): #------------------------------------------------------------------------- # Traits #------------------------------------------------------------------------- + _model_module = Unicode(None, allow_none=True, help="""A requirejs module name + in which to find _model_name. If empty, look in the global registry.""") _model_name = Unicode('WidgetModel', help="""Name of the backbone model registered in the front-end to create and sync this widget with.""") _view_module = Unicode(help="""A requirejs module in which to find _view_name. @@ -142,7 +144,9 @@ class Widget(LoggingConfigurable): def open(self): """Open a comm to the frontend if one isn't already open.""" if self.comm is None: - args = dict(target_name='ipython.widget', data={ 'model_name': self._model_name }) + args = dict(target_name='ipython.widget', + data={'model_name': self._model_name, + 'model_module': self._model_module}) if self._model_id is not None: args['comm_id'] = self._model_id self.comm = Comm(**args)