从Dynatable加载远程JSON

时间:2014-01-23 00:46:56

标签: javascript jquery json dynatable

更新: 为了避免问题完全归结为相同的原始政策,我尝试在本地提供服务,所有资产都来自{{ 1}}使用Serve。它没有解决问题。因此,由于相同的原始策略,编辑小提琴可能不起作用,但您可以在那里看到代码。


我正在尝试使用Dynatable加载外部JSON,跳过read / normalize步骤(从现有表生成JSON)。这应该得到支持,但它对我不起作用。

Here's my attempt on JSFiddle。从文档中加载JSON(这对我来说似乎并不十分有用)工作正常,如小提琴中所见。但是从URL中提取它根本不起作用。

这是我的JavaScript:

http://localhost:4000

...引用两个表,一个id为“local”,另一个id为“remote”,以及包含本地表数据的脚本:

// getting JSON from the document works, but of what use is that?
$(document).ready( function() {
    $('#local').dynatable({
        dataset: {
            records: JSON.parse($('#music').text())
        }
    });        
    // getting JSON from a remote source fails:
    $('#remote').dynatable({
        dataset: {
            ajax: true,
            ajaxOnLoad: true,
            ajaxUrl: '//www.dynatable.com/dynatable-ajax.json',
            records: []
        }
    });
});

1 个答案:

答案 0 :(得分:6)

遥控器无法工作的原因是因为当通过AJAX获取数据时,响应JSON必须包含一些元数据以及实际记录。

如果您查看AJAX example in the dynatable docs,可以点击“查看AJAX数据”以查看格式:

{
  "records": [
    {
      "someAttribute": "I am record one",
      "someOtherAttribute": "Fetched by AJAX"
    },
    {
      "someAttribute": "I am record two",
      "someOtherAttribute": "Cuz it's awesome"
    },
    {
      "someAttribute": "I am record three",
      "someOtherAttribute": "Yup, still AJAX"
    }
  ],
  "queryRecordCount": 3,
  "totalRecordCount": 3
}

您可以看到实际结果数组嵌套在响应JSON中的"records"下,并且它还返回集合中总共有多少条记录,以及当前集合中有多少条记录。

dynatable需要这个元数据的原因是为了进行分页和表格底部的record-count text。由于您的服务器正在进行实际的查询,排序和分页(例如,通过数据库查询或其他服务器端处理),因此dynatable只能看到最终结果。因此,dynatable永远不会知道:

  1. 集合中的总记录数<。

  2. 过滤/查询集合中的记录数(与所有页面相对)vs。

  3. 过滤/查询的分页集(当前页面)中有多少条记录。

  4. dynatable可以从返回的结果中推断出唯一的东西是(3)从上面开始,即在当前页面上的过滤/查询集中有多少条记录。因此,它需要从服务器返回的JSON告诉它(1),totalRecordCount和(2),即queryRecordCount

    当然,如果你不想要所有这些,你可以关闭分页和记录计数文本,并告诉dynatable结果将位于服务器返回的JSON的根目录:< / p>

    $('#remote').dynatable({
      features: {
        paginate: false,
        recordCount: false
      },
      dataset: {
        ajax: true,
        ajaxOnLoad: true,
        ajaxUrl: '//www.dynatable.com/dynatable-ajax.json',
        records: []
      },
      params: {
        records: '_root'
      }
    });