【问题标题】:jqPlot Chart – Doesn’t display the ajax datajqPlot Chart – 不显示 ajax 数据
【发布时间】:2012-05-10 14:49:23
【问题描述】:

我正在使用 jqPlot “AJAX JSON 数据渲染器”,如:http://www.jqplot.com/tests/data-renderers.php 中所述。
我的服务器端是 Spring MVC。在服务器上,我渲染了一个 Object[][] 矩阵,矩阵的每一行包含 2 个对象:[LocalTime.toString(“HH:mm”), Integer]。响应返回为“@ResponseBody”

我可以看到数据是从服务器检索的,当我在警报中显示它时,我看到以下内容:

[["09:00",5],["09:30",5],["10:00",5],["10:30",5],["11:00",10],["11:30",10],["12:00",10],["12:30",10],["13:00",5]]

我还尝试使用 List<List<Object>> 而不是数组。 我无法让它工作。我得到的只是一张空图表。 这是javascript:

<script>
    $(document).ready(function(){
      var ajaxDataRenderer = function(url, plot, options) {
        var ret = null;
        $.ajax({
          async: false,
          url: url,
          dataType:"json",
          success: function(data) {
            ret = data;
          }
        });
        alert("OUT: " + ret);
        return ret;
      };
       var jsonurl = "chartData";

      var plot2 = $.jqplot('chart', jsonurl,{
        dataRenderer: ajaxDataRenderer,
        dataRendererOptions: {
          unusedOptionalUrl: jsonurl
        }
      });
    });
</script>

我在这里看到JSON for jqPlot,每个人都建议构建一个字符串并解析它。这是唯一的方法吗?
我还查看了几个类似的问题,但找不到答案。
将不胜感激任何提示...

【问题讨论】:

  • 根据数据渲染器文档,jsonurl应该有ajax url,而不是“chartData”......这是从哪里来的?
  • 很可能正如@Rodik 所说,您的url 无效。在您的 Web 应用程序的上下文中,chartData 的真正含义是您的 servlet 的名称吗?尝试在FireFox 中运行您的应用程序,看看url looks like in Firebug` 的效果如何,然后看看它是否与您的servlet 的url 匹配。
  • chartData 是在我的控制器中映射到返回 Object[][] 矩阵的方法的 http url。 “ajax url”是什么意思?收到回复后,我认为这不是问题所在。
  • Meron 如果您收到响应并且格式正确,那么您是对的,那么url 就可以了。我确信通过 ajax url @Rodik 意味着 url 你给你的 ajax 请求。另请查看我的回答,我认为这一定是您遇到的问题。

标签: javascript spring-mvc jqplot


【解决方案1】:

这个问题是很久以前提出的,所以我假设你现在已经继续前进了......但我也在寻找这个......并且刚刚找到了答案。嗯...一个答案。

问题是当您输入日期时,您从 ajaxDataRenderer 传回的内容不再像 json。我不知道为什么,但是如果您将 dataType 更改为文本,那么您的警报将输出数据。但是图表失败了,因为它没有设置为处理字符串。

所以....你使用eval,强制js将字符串转换成一个实际的数组,像这样:

var ajaxDataRenderer = function(url, plot, options) {
     var ret = null;

     $.ajax({
      // have to use synchronous here, else the function
      // will return before the data is fetched
      async: false,
      url: url,
      dataType:"text",
      success: function(data) {
          ret = data;
          }
    });

    //clear out the loading message from the div
    $('#chartdiv').empty();
    //evaluate the returned string...to turn it into the data structure.
    return eval(ret);
};

无论如何,这对我有用。然后我让我的 url 返回代表数据的文本。

希望这可以帮助其他人寻找这个问题的答案!

【讨论】:

    【解决方案2】:

    This sample jsfiddle shows 在您的情况下,进入绘图的数据应该是什么样子。

    由于您在 x 轴上使用时间(日期),因此您必须告诉图表如何呈现它,并且没有比使用 DateAxisRenderer 更好的方法来做到这一点。下面的代码(也在示例中)显示了它是如何完成的:

        axes: {
            xaxis: {
                label: "x label",
                renderer: $.jqplot.DateAxisRenderer,
                tickOptions:{formatString:'%H:%M'}
            }
        }
    

    【讨论】:

    • 好的,我加了DateAxisRenderer 还是不行。我可以看到画布显示(将最小值和最大值添加到 x 轴)具有最小值和最大值,但没有图表。你有别的想法吗?也许它是一个同步问题? sript 是否应该位于 html 标头中?
    • 在我看来,将您的脚本始终放在标题中。虽然它可能是别的东西。我已经在答案中的 jsfiddle 中展示了如何格式化您的数据,除此之外我根本无法猜测您的代码中可能有什么问题。你为什么不建立一个 jsfiddle.net 来显示你的问题?
    • @Boro 您应该始终将脚本放在页面底部 - 这是因为浏览器必须停止所有渲染/布局才能将 JS 文件下载到位,以防万一它们包含 document.write( )。这是 YSlow 和 PageSpeed 建议的最佳做法
    • 我想我现在明白了。对于那些感兴趣的人来说,这里有一个很好的例子stevesouders.com/examples/move-scripts.php
    • 嗨@Boro,我正要回答一个例子;在 中放置一个执行 document.write('hello') 的脚本,演示脚本是内联评估的(但在渲染中不显示停止)。 +1 链接,Steve Souders 小伙写了 YSlow 并有几本关于网页性能的书 - 真正的好东西。干杯。
    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多