2016-07-14 4 views
1

Я использую dygraph для мониторинга файла CSV и использования функции динамического обновления. Когда я нависаю над графиком, чтобы показать значения кривых в легенде, они исчезают, как только график обновляется, что немного раздражает.Значения легенды динамического обновления Dygraph исчезают

<html> 
<head> 
<script type="text/javascript" src="/static/dygraph-combined.js"></script></head> 
<body> 
<div id="psu"></div> 
<script type="text/javascript"> 
    g = new Dygraph(document.getElementById("psu"), "/data/psu", 
    { 
     legend: 'always', 
     hideOverlayOnMouseOut: false, 
     ylabel: 'current (A)', 
     height: 480, 
     width: 640, 
     sigFigs: 2, 
     title: 'power interface monitor', 
     xValueFormatter: Dygraph.dateString_, 
     xAxisLabelFormatter: Dygraph.dateString_, 
     xTicker: Dygraph.dateTicker 
    }); 
    window.intervalId = setInterval(function(){g.updateOptions({ 'file': "/data/psu" }); }, 1000); 
</script> 
</html> 

Таким образом, граф все правильно отображаться и данные обновляются, только значение легенды исчезает после того, как график обновляется с g.updateOptions(). Я думал, может быть, я смогу снова вызвать какое-то событие "mouseover" после g.updateOptions(), чтобы значения возвращались, но может быть более чистый способ сделать это.

Спасибо.

ответ

0

Я нашел решение моей проблемы, но я не уверен, насколько хорошо это реализовано. Я разделяю его здесь, чтобы другие могли найти его:

$(document).ready(function() { 
 
    var data = []; 
 
    var t = new Date(); 
 
    for (var i = 10; i >= 0; i--) { 
 
    var x = new Date(t.getTime() - i * 1000); 
 
    data.push([x, Math.random()]); 
 
    } 
 

 
    var last_mousemove_evt = null; 
 
    var on_graph = false; 
 

 
    var g = new Dygraph(document.getElementById("div_g"), data, { 
 
    legend: 'always', 
 
    drawPoints: true, 
 
    showRoller: true, 
 
    valueRange: [0.0, 1.2], 
 
    labels: ['Time', 'Random'], 
 
    highlightCallback: function(e, x, pts, row) { 
 
     last_mousemove_evt = e; 
 
     on_graph = true 
 
    }, 
 
    unhighlightCallback: function(e) { 
 
     on_graph = false; 
 
    } 
 
    }); 
 
    // It sucks that these things aren't objects, and we need to store state in window. 
 
    window.intervalId = setInterval(function() { 
 
    var x = new Date(); // current time 
 
    var y = Math.random(); 
 
    data.push([x, y]); 
 
    g.updateOptions({ 
 
     'file': data 
 
    }); 
 
    if (on_graph) { 
 
     g.mouseMove_(last_mousemove_evt); 
 
    } 
 
    }, 1000); 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/dygraph/1.1.1/dygraph-combined.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 
 
<div id="div_g" style="width:600px; height:300px;"></div>

Так что я в конечном итоге с помощью highlightCallback и unhighlightCallback варианты, так что я могу понять позицию мыши и после динамического вызова обновления то dygraph.mouseMove_() чтобы перерисовать значения легенды. Кажется, работает.

Пожалуйста, дайте мне знать, если есть более приятное решение. Возможно, будет полезно включить эту функцию в dygraph.updateOptions() по умолчанию, так как кажется странным, что значения легенды исчезают после обновления.

 Смежные вопросы

  • Нет связанных вопросов^_^