【问题标题】:Cannot get vars displayed in my 'template' using Handlebars.js correctly无法正确使用 Handlebars.js 在我的“模板”中显示变量
【发布时间】:2016-02-01 16:38:24
【问题描述】:

我有一个 Handlebars 脚本,我试图通过一个对象迭代到我下面的“模板”。即使我可以在对象中看到“badNodes”(当我执行 console.log(row) 时的对象,它也不会传递给模板,我看到的只是视图/模板中地址旁边的空白条目.

任何人都可以建议我可能做错了什么 - P.S 我是 Handlebars.js 的新手

<script class="template" type="text/html">
    <div class="badNodesContainer">
        {{#row}}
        <div class="hash{{badNodes.hash}} help-tip">
            <p>
                <strong>Address: </strong>{{badNodes.address}}</br>
            </p>
        </div>
        {{/row}}
    </div>
</script>

//ajax请求的后半部分

    .done(function (data, result, jqXHR) {
        var checkinData = JSON.parse(data).data;
        var rows = [];

        //_.templateSettings.variable = "badNode";
        var source = $("script.template").html();
        var template = Handlebars.compile(source);

        $.each(checkinData, function (index, row) {
                row.badNodesHTML = "";
                var AB_action_login = '<a class="btn btn-default btn-sm" style="width:70px;text-align:left;" target="_blank" href="http://asite.com/app/login.php?username=' + row.user + '&hash=' + row.signature + '"><i class="fa fa-external-link"></i> App</a>';
                if (row.postid == null) {
                    var AB_action_order = '<a class="btn btn-default btn-sm hidden" disabled="disabled" style="width:70px;text-align:left;" target="_blank" href="http://www.mysite.co.uk/wp-admin/post.php?post=' + row.postid + '&action=edit"><i class="fa fa-external-link"></i> Order</a>';
                } else {
                    var AB_action_order = '<a class="btn btn-default btn-sm" style="width:70px;text-align:left;" target="_blank" href="http://www.mysite.co.uk/wp-admin/post.php?post=' + row.postid + '&action=edit"><i class="fa fa-external-link"></i> Order</a>';
                }
                row.AB_login = AB_action_login;
                row.AB_order = AB_action_order;
                row.AB_actions = AB_action_login + AB_action_order;

                if (row.badNodes.length) {
                    $.each(row.badNodes, function (idx, badNode) {
                        badNode.address.toString()
                        badNode.address = /:(.+)/.exec(badNode.address)[1];
                        row.badNodesHTML += template(badNode);
                        row.AB_actions;
                    });
                }
            }
        );

【问题讨论】:

    标签: javascript templates wordpress handlebars.js


    【解决方案1】:

    您正在通过模板内的#row 访问该对象,即使您传递给模板的对象如下所示:

    {
        hash: 'some hash',
        address: 'some address'
    }
    

    因此,为了绑定它,请尝试通过键访问它,而不是像这样:

    <script class="template" type="text/html">
        <div class="badNodesContainer">
            <div class="hash{{hash}} help-tip">
                <p>
                    <strong>Address: </strong>{{address}}</br>
                </p>
            </div>
        </div>
    </script>
    

    另外,假设badNodes 是一个坏节点数组,当您将row 直接传递给模板时,您可以在声明中使用each。试试这个:

    <script class="template" type="text/html">
        <div class="badNodesContainer">
            {{#each badNodes}}
            <div class="hash{{hash}} help-tip">
                <p>
                    <strong>Address: </strong>{{address}}</br>
                </p>
            </div>
            {{/each}}
        </div>
    </script>
    

    我建议您准备一个具有您想要的确切形状和形式的 javascript 对象,然后将其传递给模板。您在 $.each 循环中格式化输出并单独传递每一行,从组织的角度来看这可能会变得混乱。此外,您正在 javascript 中为您也可以放入模板中的按钮创建 html。然后,您所要做的就是将一个row 对象传递给包含所有必需信息的模板。

    重构后的版本可能如下所示:

    <style media="screen">
        .btn-zabs {
            width:70px;
            text-align:left;
        }
    </style>
    
    <script type="text/javascript">
        .done(function (data, result, jqXHR) {
            var checkinData = JSON.parse(data).data;
            var rows = [];
    
            var source = $("script.template").html();
            var template = Handlebars.compile(source);
            var $container = $("#parent-of-badNodesContainer");
    
            $.each(checkinData, function (index, row) {
                if (row.badNodes.length) {
                    $.each(row.badNodes, function (idx, badNode) {
                        badNode.address.toString()
                        badNode.address = /:(.+)/.exec(badNode.address)[1];
                    });
                }
            });
    
            $container.html(template(checkinData));
        });
    </script>
    
    <script class="template" type="text/html">
        <a class="btn btn-default btn-sm btn-zabs" target="_blank" href="http://asite.com/app/login.php?username={{user}}&hash={{signature}}"><i class="fa fa-external-link"></i> App</a>
        <div class="badNodesContainer">
            {{#each badNodes}}
            <div class="hash{{hash}} help-tip">
                <p>
                    <strong>Address: </strong>{{address}}</br>
                </p>
            </div>
            {{/each}}
        </div>
        {{#if postid}}
            <a class="btn btn-default btn-sm btn-zabs hidden" disabled="disabled" target="_blank" href="http://www.mysite.co.uk/wp-admin/post.php?post={{postid}}&action=edit"><i class="fa fa-external-link"></i> Order</a>
        {{else}}
            <a class="btn btn-default btn-sm btn-zabs" target="_blank" href="http://www.mysite.co.uk/wp-admin/post.php?post={{postid}}&action=edit"><i class="fa fa-external-link"></i> Order</a>
        {{/if}}
    </script>
    

    注意,我将按钮模板放在任意位置。我敢肯定你会想重新组织他们所属的地方。这仅用于演示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      相关资源
      最近更新 更多