Вызов Handlebar Each и JSON API, как мне заставить его передавать данные из ответа массива и помещать их в модальный handlebars

#javascript #jquery #ajax #handlebars.js

#javascript #jquery #ajax #handlebars.js

Вопрос:

 $("#searchMovieBtn").click(() => {
const movieSource = $("#movie-template").html();
const movieList = Handlebars.compile(movieSource);
const movieSearch = $("#addMovie").val();
console.log(movieSearch);
queryURL = `https://api.themoviedb.org/3/search/movie?api_key=${apiKey}amp;language=en-USamp;query=${movieSearch}amp;page=1amp;include_adult=false`;
$.ajax({
  url: queryURL,
  method: "GET"
}).then(response => {
  console.log(response);
  const results = response.results;
  const data = { movies: [] };
  for (let i = 0; i < results.length; i  ) {
    const currentTitle = {
      title: results[i].title,
      release_date: results[i].release_date
    };
    data.movies.push(currentTitle);
  }
  console.log(data);
  $("#placeholder").html(
    movieList({
      data: data
    })
  );
});
});
});
 

это моя функция, чтобы вызвать его

                 <div id="placeholder"></div>
            <script type="text/x-handlebars-template" id="movie-template">
            <ul class="list-group">
                {{#each movies}}
                {{#each this}}
              <li class="list-group-item text-dark" id="MovieTitle">{{title}}
                <span>
                  (<span id="MovieYear">{{release_date}}</span>)
                  <span>
                    <button class="btn btn-warning text-light btn-sm" id="addMovieBtn">Add to watchlist</button>
                  </span>
                </span>
              </li>
              {{/each}}
              {{/each}}
            </ul>
            </script>
 

И во что это превращается!
Я не спал всю ночь и просто не могу понять, что с ним происходит! Клянусь, я посмотрел вверх и вниз и все еще не могу найти правильный метод для использования, это сводит меня с ума! В любом случае, спасибо за помощь заранее, я уверен, что это было что-то очень простое, что я много просматривал.

Ответ №1:

В вашем решении есть несколько ошибок.

Во-первых, вы должны понимать контекстный объект, который вы передаете своему шаблону. Его форма выглядит примерно так:

 {
  data: {
    movies: [
      {
        title: "Movie Title",
        release_date: "Year"
      }
    ]
  }
}
 

Обратите внимание, что первым ключом в объекте является data . Однако в вашем шаблоне у вас нет ссылки на данные, но вы пытаетесь получить доступ movies напрямую, фактически пропуская ссылку. Учитывая эти данные, первый #each в вашем шаблоне необходимо будет обновить до:
{{#each data.movies}}

Ваша вторая проблема — это ваша вторая #each проблема в вашем шаблоне. Это #each повторяет каждое свойство каждого фильма в movies массиве. Поэтому, когда вы ссылаетесь на свойство, подобное {{title}} этому блоку, полный путь вашей ссылки выглядит примерно так data.movies[i].title.title . Там есть дополнительный «.title», потому что вы находитесь не в контексте фильма, а в одном из его свойств ( title в данном случае).

Чтобы исправить это, просто удалите второй #each .

Я создал скрипку для вашей справки.

В качестве дополнительного примечания: я бы не стал включать идентификаторы статических элементов внутри цикла. Это означает, что у вас будут повторяющиеся идентификаторы в ваших выходных данных, и это недопустимый HTML.