Я пытаюсь изучить Handlebars.js и подумал о том, как использовать его на сайте im im. Это сайт на одной странице, в котором будут два контейнера с тремя div в каждом, который будет содержать встроенных игроков Soundcloud через их API.Исключить HTML из тега скрипта
При включении div, которые содержат запросы API в теге скрипта, обработанные Handlebars, сайт ведет себя очень ненадежно и отображает только некоторых из шести игроков. Это не совсем непротиворечиво, но может показывать разных игроков все время. Проблема, кажется, в Soundcloud javascript SDK, но я не чувствую, что знакомы, чтобы копаться там слишком много.
Поэтому я подумал о том, чтобы исключить игровые divs (см. Код), чтобы они мгновенно загружались и не обрабатывались как javascript, но все же отображались под заголовком исполнителя в заголовке-заполнителе (который установлен чтобы содержать результат скрипта Handlebar).
Проблема в том, что я не могу придумать хороший способ сделать это, есть ли какая-нибудь простая функция (с помощниками Handlebars), которая поможет мне сделать то, что я хочу?
<div id="placeholder"></div>
<script id="player-template" type="text/x-handlebars-template">
<div id="container1">
Artist1 - {{title1}}
<div id="player1"></div>
Artist2 - {{title2}}
<div id="player2"></div>
Artist3 - {{title3}}
<div id="player3"></div>
</div>
<div id="container2">
Artist4 - {{title4}}
<div id="player4"></div>
Artist5 - {{title5}}
<div id="player5"></div>
Artist6 - {{title6}}
<div id="player6"></div>
</div>
</script>
<script src="js/handlebars_title_script.js"></script>
Одно решение, конечно, чтобы сделать один шаблон Handlebar для каждого артиста - Название DIV и установить заполнитель каждого шаблона в DIV, содержащего только Artist1 - {{title1}}, но это действительно разрушает точку использования Ручки для минимизации моего кодирования HTML.
Кто-нибудь получил подсказку для меня, как это решить?
Edit 1:
Я нашел другое решение, изменив в моей JavaScript (который я не отправлял в первом, так очевидно, что вы не могли бы мне помочь с этим).
$(document).ready(function() {
var hey = "heya";
SC.get("https://stackoverflow.com/users/artist/tracks", {limit: 1}, function(tracks){
var title_data1 = tracks[0].title;
hey = tracks[0].title;
alert(title_data1);
alert(hey)
});
//Data that will replace the handlebars expressions in our template
var playerData = {
title1 : hey,
};
document.getElementById('player-placeholder').innerHTML = playerTemplate(playerData);
});
Извините за плохой настрой. Единственная проблема с этим кодом заключается в том, что title1 (в переменной playerData, которая является контекстом Handlebars) получает первое значение переменной hey («heya»). Когда он будет предупрежден о всплытии реального названия, как я могу заставить title1 использовать это значение вместо того, чтобы вставлять эту переменную в более javascript (так как это приводит к тому, что упомянутая выше ошибка возникает, когда игроки появляются странно)?
Спасибо за помощь. Мне сложно понять это, хотя (новичок, я знаю), но это помогло мне подумать об альтернативном решении. Пожалуйста, проверьте мои изменения, если у вас есть время! – user3880485
Это хорошо, для меня это похоже на то, что вы столкнулись с тем, как работает JavaScript с асинхронным режимом работы с событиями. Это может быть довольно ловушкой при изучении языка. Я добавил еще один раздел ответа. – klyd
Еще раз спасибо. Хм, хорошо, я это проверю. На самом деле ваш код здесь почти идентичен моему js-коду, прежде чем я внес изменения. И хотя этот код генерирует правильные данные Handlebar в нужном месте в HTML, дело в том, чтобы переносить данные переменных в другую функцию, которая заставляет игроков казаться странными. Вы можете увидеть какой-либо другой способ объявления треков [0] .title для переменной, которая может быть прочитана в нужный момент в переменных данных? – user3880485