Bladeren bron

Don't connect changed signals to anonymous functions.

Ian Rose 8 jaren geleden
bovenliggende
commit
263ff65437
3 gewijzigde bestanden met toevoegingen van 56 en 44 verwijderingen
  1. 23 19
      packages/cells/src/model.ts
  2. 11 9
      packages/codeeditor/src/editor.ts
  3. 22 16
      packages/outputarea/src/model.ts

+ 23 - 19
packages/cells/src/model.ts

@@ -18,7 +18,7 @@ import {
 } from '@jupyterlab/coreutils';
 
 import {
-  IObservableJSON, IModelDB
+  IObservableJSON, IModelDB, IObservableValue, ObservableValue
 } from '@jupyterlab/coreutils';
 
 import {
@@ -139,14 +139,7 @@ class CellModel extends CodeEditor.Model implements ICellModel {
     }
     trusted.set(!!cell.metadata['trusted']);
     delete cell.metadata['trusted'];
-    trusted.changed.connect((value, args) => {
-      this.onTrustedChanged(args.newValue as boolean);
-      this.stateChanged.emit({
-        name: 'trusted',
-        oldValue: args.oldValue,
-        newValue: args.newValue
-      });
-    });
+    trusted.changed.connect(this.onTrustedChanged, this);
 
     if (Array.isArray(cell.source)) {
       this.value.text = (cell.source as string[]).join('\n');
@@ -231,7 +224,7 @@ class CellModel extends CodeEditor.Model implements ICellModel {
    *
    * The default implementation is a no-op.
    */
-  onTrustedChanged(value: boolean): void { /* no-op */}
+  onTrustedChanged(trusted: IObservableValue, args: ObservableValue.IChangedArgs): void { /* no-op */ }
 
   /**
    * Handle a change to the observable value.
@@ -331,13 +324,7 @@ class CodeCellModel extends CellModel implements ICodeCellModel {
         executionCount.set(null);
       }
     }
-    executionCount.changed.connect((value, args) => {
-      this.contentChanged.emit(void 0);
-      this.stateChanged.emit({
-        name: 'executionCount',
-        oldValue: args.oldValue,
-        newValue: args.newValue });
-    });
+    executionCount.changed.connect(this._onExecutionCountChanged, this);
 
     this._outputs = factory.createOutputArea({
       trusted,
@@ -400,10 +387,27 @@ class CodeCellModel extends CellModel implements ICodeCellModel {
   /**
    * Handle a change to the trusted state.
    */
-  onTrustedChanged(value: boolean): void {
-    this._outputs.trusted = value;
+  onTrustedChanged(trusted: IObservableValue, args: ObservableValue.IChangedArgs): void {
+    this._outputs.trusted = args.newValue as boolean;
+    this.stateChanged.emit({
+      name: 'trusted',
+      oldValue: args.oldValue,
+      newValue: args.newValue
+    });
   }
 
+  /**
+   * Handle a change to the execution count.
+   */
+  private _onExecutionCountChanged(count: IObservableValue, args: ObservableValue.IChangedArgs): void {
+    this.contentChanged.emit(void 0);
+    this.stateChanged.emit({
+      name: 'executionCount',
+      oldValue: args.oldValue,
+      newValue: args.newValue });
+  }
+
+
   private _outputs: IOutputAreaModel = null;
 }
 

+ 11 - 9
packages/codeeditor/src/editor.ts

@@ -14,7 +14,7 @@ import {
 } from '@phosphor/signaling';
 
 import {
-  IModelDB, ModelDB,
+  IModelDB, ModelDB, IObservableValue, ObservableValue,
   IObservableMap, IObservableString, IChangedArgs
 } from '@jupyterlab/coreutils';
 
@@ -188,17 +188,12 @@ namespace CodeEditor {
 
       let value = this.modelDB.createString('value');
       value.text = value.text || options.value || '';
+
       let mimeType = this.modelDB.createValue('mimeType');
       mimeType.set(options.mimeType || 'text/plain');
-      this.modelDB.createMap<ITextSelection[]>('selections');
+      mimeType.changed.connect(this._onMimeTypeChanged, this);
 
-      mimeType.changed.connect((val, args)=>{
-        this._mimeTypeChanged.emit({
-          name: 'mimeType',
-          oldValue: args.oldValue as string,
-          newValue: args.newValue as string
-        });
-      });
+      this.modelDB.createMap<ITextSelection[]>('selections');
     }
 
     /**
@@ -254,6 +249,13 @@ namespace CodeEditor {
       Signal.clearData(this);
     }
 
+    private _onMimeTypeChanged(mimeType: IObservableValue, args: ObservableValue.IChangedArgs): void {
+      this._mimeTypeChanged.emit({
+        name: 'mimeType',
+        oldValue: args.oldValue as string,
+        newValue: args.newValue as string
+      });
+    }
 
     protected modelDB: IModelDB = null;
     private _isDisposed = false;

+ 22 - 16
packages/outputarea/src/model.ts

@@ -11,7 +11,7 @@ import {
 
 import {
   IObservableVector, ObservableVector, nbformat,
-  IObservableValue, IModelDB
+  IObservableValue, ObservableValue, IModelDB
 } from '@jupyterlab/coreutils';
 
 import {
@@ -42,8 +42,9 @@ class OutputAreaModel implements IOutputAreaModel {
     }
     this.list.changed.connect(this._onListChanged, this);
 
+    // If we are given a IModelDB, keep an up-to-date
+    // serialized copy of the OutputAreaModel in it.
     if (options.modelDB) {
-      let changeGuard = false;
       this._modelDB = options.modelDB;
       this._serialized = this._modelDB.createValue('outputs');
       if (this._serialized.get()) {
@@ -51,20 +52,7 @@ class OutputAreaModel implements IOutputAreaModel {
       } else {
         this._serialized.set(this.toJSON());
       }
-      this._serialized.changed.connect((obs, args) => {
-        if (!changeGuard) {
-          changeGuard = true;
-          this.fromJSON(args.newValue as nbformat.IOutput[]);
-          changeGuard = false;
-        }
-      });
-      this.list.changed.connect((list, args) => {
-        if (!changeGuard) {
-          changeGuard = true;
-          this._serialized.set(this.toJSON());
-          changeGuard = false;
-        }
-      });
+      this._serialized.changed.connect(this._onSerializedChanged, this);
     }
   }
 
@@ -259,10 +247,27 @@ class OutputAreaModel implements IOutputAreaModel {
    * Handle a change to the list.
    */
   private _onListChanged(sender: IObservableVector<IOutputModel>, args: ObservableVector.IChangedArgs<IOutputModel>) {
+    if (this._serialized && !this._changeGuard) {
+      this._changeGuard = true;
+      this._serialized.set(this.toJSON());
+      this._changeGuard = false;
+    }
     this._changed.emit(args);
     this._stateChanged.emit(void 0);
   }
 
+  /**
+   * If the serialized version of the outputs have changed due to a remote
+   * action, then update the model accordingly.
+   */
+  private _onSerializedChanged(sender: IObservableValue, args: ObservableValue.IChangedArgs) {
+    if (!this._changeGuard) {
+      this._changeGuard = true;
+      this.fromJSON(args.newValue as nbformat.IOutput[]);
+      this._changeGuard = false;
+    }
+  }
+
   /**
    * Handle a change to an item.
    */
@@ -278,6 +283,7 @@ class OutputAreaModel implements IOutputAreaModel {
   private _changed = new Signal<this, IOutputAreaModel.ChangedArgs>(this);
   private _modelDB: IModelDB = null;
   private _serialized: IObservableValue = null;
+  private _changeGuard = false;
 }