Skip to content

Commit 3fa6b90

Browse files
committed
WIP - some changes to the serializers.
This was originally part of #1294, and was reverted in c64e5f6
1 parent ecf7998 commit 3fa6b90

File tree

2 files changed

+26
-47
lines changed

2 files changed

+26
-47
lines changed

jupyter-js-widgets/src/manager-base.ts

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -375,21 +375,18 @@ abstract class ManagerBase<T> {
375375
* @returns Promise for a state dictionary
376376
*/
377377
get_state(options: StateOptions): Promise<any> {
378-
var that = this;
379-
return utils.resolvePromisesDict(this._models).then(function(models) {
380-
var state = {};
381-
for (var model_id in models) {
382-
if (models.hasOwnProperty(model_id)) {
383-
var model = models[model_id];
384-
state[model_id] = utils.resolvePromisesDict({
385-
model_name: model.name,
386-
model_module: model.module,
387-
model_module_version: model.get('_model_module_version'),
388-
state: model.constructor._serialize_state(model.get_state(options.drop_defaults), that)
389-
});
390-
}
391-
}
392-
return utils.resolvePromisesDict(state);
378+
return utils.resolvePromisesDict(this._models).then((models) => {
379+
let state = {};
380+
Object.keys(models).forEach(model_id => {
381+
let model = models[model_id];
382+
state[model_id] = {
383+
model_name: model.name,
384+
model_module: model.module,
385+
model_module_version: model.get('_model_module_version'),
386+
state: model.serialize(model.get_state(options.drop_defaults))
387+
};
388+
});
389+
return state;
393390
}).catch(utils.reject('Could not get state of widget manager', true));
394391
};
395392

jupyter-js-widgets/src/widget.ts

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -383,31 +383,35 @@ class WidgetModel extends Backbone.Model {
383383
/**
384384
* Serialize widget state.
385385
*
386-
* A serializer is a function which takes in a state attribute and a widget,
387-
* and synchronously returns a JSONable object. The returned object will
386+
* @param state - a dictionary of state to be serialized
387+
*
388+
* A serializer is a function which takes in a state value and an options object
389+
* {manager: widget manager instance, model: model instance, key: state key},
390+
* and synchronously returns a JSONable object. The state values in the returned object will
388391
* have toJSON called if possible, and the final result should be a
389392
* primitive object that is a snapshot of the widget state that may have
390393
* binary array buffers.
391394
*/
392395
serialize(state) {
393396
const serializers = (this.constructor as typeof WidgetModel).serializers || {};
394-
for (const k of state) {
397+
let newState = {};
398+
Object.keys(state).forEach(k => {
395399
try {
396400
if (serializers[k] && serializers[k].serialize) {
397-
state[k] = (serializers[k].serialize)(state[k], this);
401+
newState[k] = (serializers[k].serialize)(state[k], {manager: this.widget_manager, model: this, key: k});
398402
} else {
399-
// the default serializer just deep-copies the object
400-
state[k] = JSON.parse(JSON.stringify(state[k]));
403+
// the default serializer just deep-copies the value
404+
newState[k] = JSON.parse(JSON.stringify(state[k]));
401405
}
402-
if (state[k].toJSON) {
403-
state[k] = state[k].toJSON();
406+
if (newState[k].toJSON) {
407+
newState[k] = newState[k].toJSON();
404408
}
405409
} catch (e) {
406410
console.error("Error serializing widget state attribute: ", k);
407411
throw e;
408412
}
409-
}
410-
return state;
413+
});
414+
return newState;
411415
}
412416

413417
send_sync_message(state, callbacks) {
@@ -487,28 +491,6 @@ class WidgetModel extends Backbone.Model {
487491
return utils.resolvePromisesDict(deserialized);
488492
}
489493

490-
/**
491-
* Returns a promise for the serialized state. The second argument
492-
* is an instance of widget manager.
493-
*/
494-
static _serialize_state(state, manager) {
495-
var serializers = this.serializers;
496-
var serialized;
497-
if (serializers) {
498-
serialized = {};
499-
for (var k in state) {
500-
if (serializers[k] && serializers[k].serialize) {
501-
serialized[k] = (serializers[k].serialize)(state[k], manager);
502-
} else {
503-
serialized[k] = state[k];
504-
}
505-
}
506-
} else {
507-
serialized = state;
508-
}
509-
return utils.resolvePromisesDict(serialized);
510-
}
511-
512494
static serializers: any;
513495
widget_manager: any;
514496
state_change: any

0 commit comments

Comments
 (0)