Handlebars.js не любит квадратные кронштейны спереди
-
27-10-2019 - |
Вопрос
Я использую php-backend, backbone.js и handlebars.js. Мои запросы на JavaScript на данные, а данные JSON успешно возвращаются (json_encode).
Когда я даю эти данные JSON в шаблон руля, он не отображается. Я понял, что квадратные кронштейны спереди и сзади моего объекта JSON «не любят» на руках. JS и не отображаются. Посмотрите на код ниже.
var ArticleListView = Backbone.View.extend(
{
el: $('#main'),
render: function()
{
var template = Handlebars.compile($("#articles_hb").html());
$(this.el).html(template([{"articles":[{"title" : "1"}, {"title" : "2"}]}]));
return this;
}
});
Теперь, если я возьму кронштейны, это работает нормально. В чем дело? Почему квадратные кронштейны там в первую очередь? Как мне избавиться от них?
Решение
Руль хочет объект для контекста, поскольку он использует контекст в качестве простой таблицы поиска для значений шаблонов. Итак, вам нужно пройти объект ({ ... }
) к template()
, не массив ([ ... ]
).
Кто -то дает вам один массив элементов, который содержит нужный вам объект контекста. Либо исправьте PHP, который производит JSON для отправки объекта JSONIFIED (ассоциативный массив в терминах PHP) без обертки массива, или лишить массив в клиентском коде с чем -то вроде этого:
$(this.el).html(template(context[0]));
Если у вас есть этот буквальный код:
$(this.el).html(template([{"articles":[{"title" : "1"}, {"title" : "2"}]}]));
В вашем файле JavaScript вы должны к тому, что генерирует этот код и исправляет его. Если у вас есть буквальные данные, подобные тем, которые встроены в ваш взгляд на основу, то вы, вероятно, не используете магистраль правильно, данные для вашего шаблона, вероятно, должны исходить из модели основы.
Если вы получаете этот JSON от модели основы, то я предполагал, что вы звоните toJSON
На коллекции (которая возвращает массив), а не единственную модель, где toJSON
должен дать вам объект JavaScript.
Другие советы
Совершенно разумно вызовать руль, чтобы зацикливаться на выводе коллекции. Также массив не является плохим дизайнерским решением для обработки данных в представлениях.
У руля есть специальный синтаксис для работы с числовыми идентификаторами или символом, Как описано здесь. Анкет Таким образом, более правильный ответ заключается в том, что руля может получить доступ к массивам в таких шаблонах:
{{people.attributes.[0]}} // akin to people.attributes[0]
{{people.attributes.[1]}} // akin to people.attributes[1]
Ввод: Mails: [{заголовки: {субъект: ["Привет, дорогая", "... еще"]}}, ... подробнее
<ul>
{{#each mails}}
<li>.
{{headers.subject.[0]}}
</li>
{{/each}}
</ul>