You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:01:32