2014-01-23 2 views
9

Update:, чтобы избежать возможности того, что проблема возникает только до той же политики происхождения, я пытался служить это локально, где все средства поступают из http://localhost:4000 с использованием Serve. Это не решило проблему. Поэтому редактирование скрипки может не работать из-за той же политики происхождения, но вы можете увидеть там код.нагрузки удаленного JSON от Dynatable


Я пытаюсь использовать Dynatable для загрузки внешнего JSON, пропуская чтения (шаг, который генерирует JSON из существующей таблицы)/нормализации. Предполагается, что это поддерживается, но это не работает для меня.

Here's my attempt on JSFiddle. Загрузка JSON из документа (что для меня не очень полезно) работает отлично, как видно на скрипке. Но вытащить его из URL-адреса совсем не работает.

Вот мой JavaScript:

// 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: [] 
     } 
    }); 
}); 

... который относится к двум таблицам, один с идентификатором «локального», а другой с идентификатором «удаленного», и сценарий, содержащий данные для локальная таблица:

<h3>Remote JSON: Failing</h3> 
<table class="table table-striped" id="remote"> 
    <thead> 
    <th>Some Attribute</th> 
    <th>Some Other Attribute</th> 
    </thead> 
    <tbody> 
    </tbody> 
</table> 
<hr> 
<h3>Local JSON: Succeeding</h3> 
<table class="table table-striped" id="local"> 
    <thead> 
    <th style="color: black;">Band</th> 
    <th>Album</th> 
    </thead> 
    <tbody> 
    </tbody> 
</table> 
<script id="music"> 
[ 
    { 
     "band": "The Police", 
     "album": "Ghost In The Machine" 
    },{ 
     "band": "Supertramp", 
     "album": "Breakfast In America" 
    },{ 
     "band": "Peter Tosh", 
     "album": "Mama Africa" 
    },{ 
     "band": "The Police", 
     "album": "Regatta d'Blanc" 
    },{ 
     "band": "The Police", 
     "album": "Zenyatta Mondatta" 
    },{ 
     "band": "Supertramp", 
     "album": "Crime of the Century" 
    },{ 
     "band": "Talking Heads", 
     "album": "Remain in Light" 
    },{ 
     "band": "Talking Heads", 
     "album": "Speaking in Tongues" 
    } 
] 
</script> 
+0

Вот моментальный снимок вашего кода с хромированием с флагом «-disable-web-security». http://imgur.com/Vcxz45e –

+0

Также имейте в виду, что другой порт имеет другое происхождение. Таким образом, страница, запущенная на localhost: 80, не может получить доступ к ресурсу из localhost: 4000 –

+0

Хорошая точка в портах, но здесь это не проблема, поскольку я обслуживаю все, начиная с порта 4000. – iconoclast

ответ

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 
} 

Вы можете увидеть фактический массив результатов вложен под "records" в ответ JSON, и он также возвращает количество записей в наборе, а также количество в текущем наборе.

Причина, по которой эти метаданные необходимы динамометрическим способом, состоит в том, чтобы сделать разбиение на страницы и record-count text внизу таблицы. Поскольку ваш сервер выполняет фактический запрос, сортировку и разбиение на страницы (например, через запрос базы данных или другую обработку на стороне сервера), dynatable видит только конечный результат. Поэтому dynatable не будет знать:

  1. сколько всего записей в наборе VS.

  2. , сколько записей в отфильтрованный/опрашивается множество (на всех страницах) против

  3. количество записей в отфильтрованном/запрошенном наборе страниц (на текущей странице).

Единственное dynatable может вывести из возвращенных результатов (3) выше, то есть, сколько записей в отфильтрованный/опрошена установлен на текущей странице. Таким образом, для возврата ему требуется возвращенный JSON с сервера (1), который является totalRecordCount и (2), который является queryRecordCount.

Конечно, если вы не хотите все это, вы можете просто отключить разбиение на страницы и текст записи и сообщить, что результаты будут расположены в корневом каталоге JSON, возвращаемом сервером:

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

Спасибо! (Я заметил это мета-данные, но понятия не имел, что это было необходимо, так как его не было в другом месте. Если это требование указано в документах, я просто пропустил его.) – iconoclast

+0

Еще одна причина, по которой я оставил метаданные, - это то, что я wasn 't планируя сделать мой сервер делать разбиение на страницы и т. д. Я просто хотел пропустить шаг HTML-JSON, так как мой сервер приложений собирает данные с веб-службы как JSON, и нет смысла go JSON -> HTML -> JSON, если я могу просто передать все это в браузер как JSON. Разве это невозможно? Должен ли я либо конвертировать в HTML, либо служить в браузере на странице JSON за раз? – iconoclast

+0

Это хороший момент, я обновлю документы, чтобы получить более четкое представление о формате для режима AJAX. – jangosteve

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