Handlebars渲染API数据异常:控制台获数正常但页面无渲染
问题分析与解决
核心问题是模板遍历逻辑和传入数据不匹配,外加模板容器的结构小问题:
- 你传给Handlebars模板的是
data.data.memes(一个数组),但模板里写的{{#each memes}}是在当前上下文里找memes属性——而当前上下文就是这个数组本身,根本没有这个属性,所以遍历不会触发,自然渲染不出内容。 - 模板脚本直接放在渲染容器内,虽然不影响功能,但容易在后续DOM操作中出现意外,更规范的做法是分开存放。
两种解决方法
方法1:修改模板的遍历逻辑
把模板里的{{#each memes}}改成{{#each this}}(this代表当前上下文,也就是传入的数组),同时把模板移出渲染容器:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.5/handlebars.min.js"></script> <title>Meme Display</title> </head> <body> <script id="meme-template" type="text/x-handlebars-template"> {{#each this}} <div class="memes"> <img src="{{url}}" alt="{{name}}"> <p>{{name}}</p> </div> {{/each}} </script> <div id="meme-container"></div> <script> $(document).ready(function () { $.get("https://api.imgflip.com/get_memes", function (data) { const templateSource = $("#meme-template").html(); const template = Handlebars.compile(templateSource); const renderedHTML = template(data.data.memes); $("#meme-container").html(renderedHTML); console.log(data); }); }); </script> </body> </html>
方法2:修改传入模板的数据结构
不用改模板,把数组包装成一个带memes属性的对象传给模板,这样模板里的{{#each memes}}就能正确找到数组:
// 把原来的这行 const renderedHTML = template(data.data.memes); // 改成 const renderedHTML = template({ memes: data.data.memes });
两种方法都能解决你的渲染问题,选自己顺手的就行。
内容的提问来源于stack exchange,提问作者Rachel27
相关产品推荐
相关产品推荐

