##// END OF EJS Templates
Merge pull request #6763 from takluyver/require-widget-models-comm-targets...
Min RK -
r18502:e033a97c merge
parent child Browse files
Show More
@@ -65,20 +65,40 define([
65 65
66 66 CommManager.prototype.comm_open = function (msg) {
67 67 var content = msg.content;
68 var f = this.targets[content.target_name];
69 if (f === undefined) {
70 console.log("No such target registered: ", content.target_name);
71 console.log("Available targets are: ", this.targets);
72 return;
73 }
74 var comm = new Comm(content.target_name, content.comm_id);
75 this.register_comm(comm);
76 try {
77 f(comm, msg);
78 } catch (e) {
79 console.log("Exception opening new comm:", e, e.stack, msg);
80 comm.close();
81 this.unregister_comm(comm);
68 var that = this;
69
70 var instantiate_comm = function(target) {
71 var comm = new Comm(content.target_name, content.comm_id);
72 that.register_comm(comm);
73 try {
74 target(comm, msg);
75 } catch (e) {
76 console.log("Exception opening new comm:", e, e.stack, msg);
77 comm.close();
78 that.unregister_comm(comm);
79 }
80 };
81
82 if (content.target_module) {
83 // Load requirejs module for comm target
84 require([content.target_module], function(mod) {
85 var target = mod[content.target_name];
86 if (target !== undefined) {
87 instantiate_comm(target)
88 } else {
89 console.log("Comm target " + content.target_name +
90 " not found in module " + content.target_module);
91 }
92 }, function(err) { console.log(err); });
93 } else {
94 // No requirejs module specified: look for target in registry
95 var f = this.targets[content.target_name];
96 if (f === undefined) {
97 console.log("No such target registered: ", content.target_name);
98 console.log("Available targets are: ", this.targets);
99 return;
100 }
101 instantiate_comm(f)
82 102 }
83 103 };
84 104
@@ -188,13 +188,33 define([
188 188 WidgetManager.prototype._handle_comm_open = function (comm, msg) {
189 189 // Handle when a comm is opened.
190 190 var that = this;
191 var model_id = comm.comm_id;
191
192 var instantiate_model = function(ModelType) {
193 var model_id = comm.comm_id;
194 var widget_model = new ModelType(that, model_id, comm);
195 widget_model.on('comm:close', function () {
196 delete that._models[model_id];
197 });
198 that._models[model_id] = widget_model;
199 };
200
192 201 var widget_type_name = msg.content.data.model_name;
193 var widget_model = new WidgetManager._model_types[widget_type_name](this, model_id, comm);
194 widget_model.on('comm:close', function () {
195 delete that._models[model_id];
196 });
197 this._models[model_id] = widget_model;
202 var widget_module = msg.content.data.model_module;
203
204 if (widget_module) {
205 // Load the module containing the widget model
206 require([widget_module], function(mod) {
207 if (mod[widget_type_name]) {
208 instantiate_model(mod[widget_type_name]);
209 } else {
210 console.log("Error creating widget model: " + widget_type_name
211 + " not found in " + widget_module);
212 }
213 }, function(err) { console.log(err); });
214 } else {
215 // No module specified, load from the global models registry
216 instantiate_model(WidgetManager._model_types[widget_type_name]);
217 }
198 218 };
199 219
200 220 // Backwards compatability.
@@ -98,6 +98,8 class Widget(LoggingConfigurable):
98 98 #-------------------------------------------------------------------------
99 99 # Traits
100 100 #-------------------------------------------------------------------------
101 _model_module = Unicode(None, allow_none=True, help="""A requirejs module name
102 in which to find _model_name. If empty, look in the global registry.""")
101 103 _model_name = Unicode('WidgetModel', help="""Name of the backbone model
102 104 registered in the front-end to create and sync this widget with.""")
103 105 _view_module = Unicode(help="""A requirejs module in which to find _view_name.
@@ -142,7 +144,9 class Widget(LoggingConfigurable):
142 144 def open(self):
143 145 """Open a comm to the frontend if one isn't already open."""
144 146 if self.comm is None:
145 args = dict(target_name='ipython.widget', data={ 'model_name': self._model_name })
147 args = dict(target_name='ipython.widget',
148 data={'model_name': self._model_name,
149 'model_module': self._model_module})
146 150 if self._model_id is not None:
147 151 args['comm_id'] = self._model_id
148 152 self.comm = Comm(**args)
@@ -31,6 +31,8 class Comm(LoggingConfigurable):
31 31 return self.kernel.session
32 32
33 33 target_name = Unicode('comm')
34 target_module = Unicode(None, allow_none=True, help="""requirejs module from
35 which to load comm target.""")
34 36
35 37 topic = Bytes()
36 38 def _topic_default(self):
@@ -91,7 +93,9 class Comm(LoggingConfigurable):
91 93 try:
92 94 self._publish_msg('comm_open',
93 95 data=data, metadata=metadata, buffers=buffers,
94 target_name=self.target_name)
96 target_name=self.target_name,
97 target_module=self.target_module,
98 )
95 99 self._closed = False
96 100 except:
97 101 comm_manager.unregister_comm(self)
General Comments 0
You need to be logged in to leave comments. Login now