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 |
|
|
|
73 |
|
|
|
74 | var comm = new Comm(content.target_name, content.comm_id); | |
|
75 | this.register_comm(comm); | |
|
76 | try { | |
|
77 |
|
|
|
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', |
|
|
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