2016-12-19 3 views
1

Я использую flotCharts, и когда я использую две или более гистограммы, при зависании панели отображается только значение последнего графика, а остальные графики то же значение первого. Вот код:jQuery flotcharts - всплывающая подсказка показывает только значение первого графика

HTML:

<div class="flot-chart"> 
    <div class="flot-chart-content" id="[email protected]"></div> 
</div> 

JavaScript:

var [email protected] = [ 
    @foreach (var serie in Model.Series) 
    { 
     <text> 
      { 
       label: '@serie.Name', 
       @DisplayGraphType(serie) 
       data: [ 
        @foreach (var point in serie) 
        { 
         <text> 
          [@point.Item1, @point.Item2], 
         </text> 
        } 
       ] 
      }, 
     </text> 
    } 
]; 

var xlabels = [ 
    @foreach (var lbl in Model.Labels) 
    { 
     <text>[@lbl.Item1, "@lbl.Item2"],</text> 
    } 
]; 

function getLabel(xval) { 
    var lbl = xval; 
    xlabels.forEach(function(e){ 
     console.log(parseInt(e[0]) == parseInt(xval)); 
     if (parseInt(e[0]) == parseInt(xval)) { 
      lbl = e[1]; 
     } 
    }); 
    return lbl; 
} 

$(function() { 
    $.plot($("#[email protected]"), [email protected], { 
     series: { 
      lines: { 
       lineWidth: 2, 
       fill: @((Model.Series.Count() == 1).ToString().ToLower()), 
      }, 
      bars: { 
       barWidth: 0.6, 
       align: "center" 
      }, 
      points: { 
       fill: @((Model.Series.Count() == 1).ToString().ToLower()), 
      } 
     }, 
     xaxis: { 
      ticks: xlabels, 
      tickDecimals: 0 
     }, 
     colors: @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.Series.Select(o => o.Color).ToArray())), 
     grid: { 
      color: "#999999", 
      hoverable: true, 
      clickable: true, 
      borderWidth: 0, 
     }, 
     legend: { 
      show: true 
     }, 
     tooltip: true, 
     tooltipOpts: { 
      content: function(label, xval, yval) { 
       var content = getLabel(xval) + ": " + yval; 
       return content; 
      }, 
     } 
    }); 
}); 

@ControlID значение является Guid, и он автоматически генерируется случайным образом, и это всегда отличается от диаграммы.

В приведенном ниже примере, когда я зависать на второй строке графика, это показывает второй бар значение другого графа (только xaxes неверно): enter image description here

+0

Ваш код js включен в число раз на странице, один раз для каждого графика? Затем вы перезаписываете «xlabels» и оставляете только значения из последнего графика. Попробуйте также использовать свой идентификатор. – Raidri

+0

Да, я помещаю этот скрипт на каждый график, и, вероятно, вы правы, они перезаписывают значения. Где я должен положить ID? У меня есть ControlID, который идентифицирует каждый граф. –

+1

Измените имя на 'xlabels_ @ ControlID', как вы это делаете для' series_ @ ControlID'. Вам также нужно будет изменить функцию 'getLabel()'. – Raidri

ответ

0

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

var [email protected] = [ 
    @foreach (var serie in Model.Series) 
    { 
     <text> 
      { 
       label: '@serie.Name', 
       @DisplayGraphType(serie) 
       data: [ 
        @foreach (var point in serie) 
        { 
         <text> 
          [@point.Item1, @point.Item2], 
         </text> 
        } 
       ] 
      }, 
     </text> 
    } 
]; 

var [email protected] = [ 
    @foreach (var lbl in Model.Labels) 
    { 
     <text>[@lbl.Item1, "@lbl.Item2"],</text> 
    } 
]; 

function [email protected](ControlID)(xval) { 
    var lbl = xval; 
    [email protected](ControlID).forEach(function(e){ 
     console.log(parseInt(e[0]) == parseInt(xval)); 
     if (parseInt(e[0]) == parseInt(xval)) { 
      lbl = e[1]; 
     } 
    }); 
    return lbl; 
} 

$(function() { 
    $.plot($("#[email protected]"), [email protected], { 
     series: { 
      lines: { 
       lineWidth: 2, 
       fill: @((Model.Series.Count() == 1).ToString().ToLower()), 
      }, 
      bars: { 
       barWidth: 0.6, 
       align: "center" 
      }, 
      points: { 
       fill: @((Model.Series.Count() == 1).ToString().ToLower()), 
      } 
     }, 
     xaxis: { 
      ticks: [email protected], 
      tickDecimals: 0 
     }, 
     colors: @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.Series.Select(o => o.Color).ToArray())), 
     grid: { 
      color: "#999999", 
      hoverable: true, 
      clickable: true, 
      borderWidth: 0, 
      @if (Model.LimitLine != null) 
      { 
       <text> 
        markings: [ 
         { color: '#000', lineWidth: 1, yaxis: { from: @Model.LimitLine, to: @Model.LimitLine }}, 
        ] 
       </text> 
      } 
      }, 
     legend: { 
      show: true 
     }, 
     tooltip: true, 
     tooltipOpts: { 
      content: function(label, xval, yval) { 
       var content = [email protected](ControlID)(xval) + ": " + yval; 
       return content; 
      }, 
     } 
    }); 
});