Store old callbacks and reattach them on detach()
authormjanda <mjanda@users.noreply.github.com>
Mon, 2 Feb 2015 09:14:13 +0000 (10:14 +0100)
committerRobert Konigsberg <konigsberg@google.com>
Tue, 26 May 2015 20:46:38 +0000 (16:46 -0400)
Conflicts:
extras/synchronizer.js

extras/synchronizer.js

index 922da41..e0459fc 100644 (file)
@@ -44,6 +44,12 @@ Dygraph.synchronize = function(/* dygraphs..., opts */) {
   };
   var dygraphs = [];
 
+  var prevCallbacks = {
+    draw: null,
+    highlight: null,
+    unhighlight: null
+  };
+
   var parseOpts = function(obj) {
     if (!(obj instanceof Object)) {
       throw 'Last argument must be either Dygraph or Object.';
@@ -93,11 +99,11 @@ Dygraph.synchronize = function(/* dygraphs..., opts */) {
 
   // Listen for draw, highlight, unhighlight callbacks.
   if (opts.zoom) {
-    attachZoomHandlers(dygraphs);
+    attachZoomHandlers(dygraphs, opts, prevCallbacks);
   }
 
   if (opts.selection) {
-    attachSelectionHandlers(dygraphs);
+    attachSelectionHandlers(dygraphs, prevCallbacks);
   }
 
   return {
@@ -105,12 +111,12 @@ Dygraph.synchronize = function(/* dygraphs..., opts */) {
       for (var i = 0; i < dygraphs.length; i++) {
         var g = dygraphs[i];
         if (opts.zoom) {
-          g.updateOptions({drawCallback: null});
+          g.updateOptions({drawCallback: prevCallbacks.draw});
         }
         if (opts.selection) {
           g.updateOptions({
-            highlightCallback: null,
-            unhighlightCallback: null
+            highlightCallback: prevCallbacks.highlight,
+            unhighlightCallback: prevCallbacks.unhighlight
           });
         }
       }
@@ -121,15 +127,14 @@ Dygraph.synchronize = function(/* dygraphs..., opts */) {
   };
 };
 
-// TODO: call any `drawCallback`s that were set before this.
-function attachZoomHandlers(gs) {
+function attachZoomHandlers(gs, syncOpts, prevCallbacks) {
   var block = false;
   for (var i = 0; i < gs.length; i++) {
     var g = gs[i];
-    var oldDC = g.getFunctionOption('drawCallback');
+    prevCallbacks.draw = g.getFunctionOption('drawCallback');
     g.updateOptions({
       drawCallback: function(me, initial) {
-        if (oldDC) oldDC(me, initial);
+        if (prevCallbacks.draw) prevCallbacks.draw(me, initial);
         if (block || initial) return;
         block = true;
         var range = me.xAxisRange();
@@ -147,15 +152,15 @@ function attachZoomHandlers(gs) {
   }
 }
 
-function attachSelectionHandlers(gs) {
+function attachSelectionHandlers(gs, prevCallbacks) {
   var block = false;
   for (var i = 0; i < gs.length; i++) {
     var g = gs[i];
-    var oldHC = g.getFunctionOption('highlightCallback');
-    var oldUHC = g.getFunctionOption('unhighlightCallback');
+    prevCallbacks.highlight = g.getFunctionOption('highlightCallback');
+    prevCallbacks.unhighlight = g.getFunctionOption('unhighlightCallback');
     g.updateOptions({
       highlightCallback: function(event, x, points, row, seriesName) {
-        if (oldHC) oldHC(event, x, points, row, seriesName);
+        if (prevCallbacks.highlight) prevCallbacks.highlight(event, x, points, row, seriesName);
         if (block) return;
         block = true;
         var me = this;
@@ -169,7 +174,7 @@ function attachSelectionHandlers(gs) {
         block = false;
       },
       unhighlightCallback: function(event) {
-        if (oldUHC) oldUHC(event);
+        if (prevCallbacks.unhighlight) prevCallbacks.unhighlight(event);
         if (block) return;
         block = true;
         var me = this;