Я использую Thorax (Backbone + Handlebars) для разработки приложения и пытаюсь загрузить внешний файл JSON, который будет использоваться в шаблоне. Работа с Coffeescript.
Мои тестовые данные JSON:
{
"name" : "John Doe"
}
Мой шаблон:
Thorax.templates['space'] = Handlebars.compile """
<h2>Hello, {{name}}.</h2>
"""
Функция успеха моего вызова Ajax:
success: (json) =>
data = {space: json}
$(app.appContainer).html(@template(data))
Весь процесс работает до фактического отображения данных в шаблоне. Так что все, что я получаю, это Hello. - Я пробовал следовать инструкциям здесь и присваивал данные JSON объекту, без везения. И прежде чем вы спросите, я проверил console.log
'ed json
чтобы проверить, что данные JSON на самом деле проходят.
Какие-либо предложения?
Высказывание @template(json)
должно работать, если json
действительно является объектом { name: 'John Doe' }
. Но похоже, что вы получаете строку JSON в аргументе json
а не в анализируемом объекте. Это объясняет результаты, которые вы видите из console.log
, вывод в консоли больше похож на то, что
console.log("{\n\"name\" : \"John Doe\"\n}")
будет производить, чем то, что
console.log({"name": "John Doe"})
будет производить.
Возможно, ваш сервер отправляет обратно JSON с неправильным Content-Type, поэтому никто не знает, что он должен пройти через JSON.parse
до того, как будет вызван ваш обработчик. Попробуйте установить код сервера, чтобы включить заголовок Content-Type: application/json
; то вы можете сказать:
success: (json) =>
$(app.appContainer).html(@template(json))
и он должен работать. Если вы не можете этого сделать, то в крайнем случае вы можете сами проанализировать JSON:
success: (json) =>
json = JSON.parse(json)
$(app.appContainer).html(@template(json))
@template(json)
вместо того, чтобы оборачивать входящее{name: 'John Doe'}
в другой объект?