@@ -383,31 +383,35 @@ class WidgetModel extends Backbone.Model {
383
383
/**
384
384
* Serialize widget state.
385
385
*
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
388
391
* have toJSON called if possible, and the final result should be a
389
392
* primitive object that is a snapshot of the widget state that may have
390
393
* binary array buffers.
391
394
*/
392
395
serialize ( state ) {
393
396
const serializers = ( this . constructor as typeof WidgetModel ) . serializers || { } ;
394
- for ( const k of state ) {
397
+ let newState = { } ;
398
+ Object . keys ( state ) . forEach ( k => {
395
399
try {
396
400
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 } ) ;
398
402
} 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 ] ) ) ;
401
405
}
402
- if ( state [ k ] . toJSON ) {
403
- state [ k ] = state [ k ] . toJSON ( ) ;
406
+ if ( newState [ k ] . toJSON ) {
407
+ newState [ k ] = newState [ k ] . toJSON ( ) ;
404
408
}
405
409
} catch ( e ) {
406
410
console . error ( "Error serializing widget state attribute: " , k ) ;
407
411
throw e ;
408
412
}
409
- }
410
- return state ;
413
+ } ) ;
414
+ return newState ;
411
415
}
412
416
413
417
send_sync_message ( state , callbacks ) {
@@ -487,28 +491,6 @@ class WidgetModel extends Backbone.Model {
487
491
return utils . resolvePromisesDict ( deserialized ) ;
488
492
}
489
493
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
-
512
494
static serializers : any ;
513
495
widget_manager : any ;
514
496
state_change : any
0 commit comments