javascript - 从外部 html 文件加载handlebars.js 模板没有显示任何内容

标签 javascript html handlebars.js mustache

这个问题有点考验我的 JS 技能,所以我可能会像个白痴一样解释它。

这是我的 JavaScript,用于从服务器获取 json,并尝试将其推送到模板中:

    //Server Interface Start
//Access the web api for The User:
var lucidServer = (function () {
    //global error handler
    $(document).ajaxError(function (event, xhr) {
        alert(xhr.status + " : " + xhr.statusText);
    });
    //client Calls
    var getClients = function (id) {
        return $.ajax(clientUrl + "/list/" + id)
    };
    var getClient = function (id) {
        return $.ajax(clientUrl + "/details/" + id)
    };

    //push them out to the world!
    return {
        getClients: getClients,
        getClient: getClient,
    };
}());
//Server Interface End

(function () {
    //list of clients
    var refreshClients = function () {
        lucidServer.getClients(1).done(showAllClients);
    };
    var showAllClients = function (templateInput) {
        var source;
        var template;
        var path = '../Templates/indexTemplates.html'
        $.ajax({
            url: path,
            cache: true,
            success: function (data) {
                source = data;
                template = Handlebars.compile(source);
                $('#clientListOutput').html(template(templateInput));
            }
        });
    };
    $(function () {
        refreshClients();
    });
}());

GetClients 工作正常并返回我期望的 Json 数据。当我检查 templateInput 时,它显示了我所期望的内容。

这是外部模板:

<script id="clientList" type="text/html">

<div id="clients">
    {{#each client}}
                <span data-id="{{this.iD}}" />
    <div>
        <p>{{this.iD}}</p>
        <p>{{this.name}}</p>
    </div>
    {{/each}}
</div>
</script>

我最终的目标是将所有模板保存在一个可以通过脚本 ID 调用的 html 文件中,或者让每个模板成为我可以调用的自己的文件。当我运行此页面时,没有显示任何内容,没有错误或任何内容。这是整个索引页:

    <!DOCTYPE html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js">
<!--<![endif]-->
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title></title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width" />
    <link rel="stylesheet" href="../../Content/normalize.css">
    <link rel="stylesheet" href="../../Content/main.css">
    <script src="../../scripts/libs/modernizr-2.6.2.min.js"></script>
</head>
<body>
    <!--[if lt IE 7]>
            <p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p>
        <![endif]-->
    <section id="Application">
        <div id="clientListOutput">
        </div>
        <div id="clientCreateOutput">
        </div>
    </section>
    <footer>
    </footer>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="../../scripts/libs/jquery-1.8.2.min.js"><\/script>')</script>
    <script src="../../scripts/plugins.js"></script>
    <script src="../../scripts/main.js"></script>
    <script type="text/javascript" src="../../Scripts/libs/handlebars.js"></script>
    <script>
        var freelancerUrl = '@Url.RouteUrl("ApiControllerAndIntegerId", new { httproute="", controller = "Freelancer"})';
        var clientUrl = '@Url.RouteUrl("ApiControllerAction", new { httproute="", controller = "Client"})';
        var projectUrl = '@Url.RouteUrl("ApiControllerAction", new { httproute="", controller = "Project"})';
        var storyUrl = '@Url.RouteUrl("ApiControllerAndIntegerId", new { httproute="", controller = "Story"})';
    </script>
    <script type="text/javascript" src="../../Scripts/serverInterface.js"></script>
</body>
</html>

编辑

我稍微改变了模板的外观。通过在 Chrome 工具中调试 js,它告诉我 showallclients 中的 ajax 成功行中未定义“数据”。

最佳答案

您需要使用 getClient 返回的数据调用模板。在您的示例中,showAllClients 的参数被成功回调中的参数遮盖,因为您使用相同的名称(数据)。将 showAllClients 中的参数名称更改为其他名称,并将其传递给模板函数。

(function () {

        //list of clients
        var refreshClients = function () {
           $.when(lucidServer.getClients(1)).done(showAllClients);
        };
        var showAllClients = function (templateInput) {
            var source;
            var template;
            var path = 'Templates/indexTemplates.html'
            $.ajax({
                url: path,
                cache: true,
                success: function (data) {
                    source = data;
                    template = Handlebars.compile(source);
                    $('#clientListOutput').html(template(templateInput));
                }
            });
        };

        $(function () {

            refreshClients();
        });
    }());

编辑:

在模板中,您需要在每个 block 中引用this:

<div id="clients">
    {{#each client}}
                <span data-id="{{this.id}}">
                    <div>
                        <p>{{this.iD}}</p>
                        <p>{{this.name}}</p>
                     ...
                    </div>
        {{/each}}
</div>

在您的示例中,您使用嵌套迭代器,我不确定是否支持它。请阅读How do I use nested iterators with Mustache.js or Handlebars.js?Ember.js / Handlebars nested each iterations不同的方法。

关于javascript - 从外部 html 文件加载handlebars.js 模板没有显示任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13075132/

相关文章:

javascript - 过滤路径数组的干净方法

javascript - ExpressJS ajax发送空数据

javascript - Parsley.js 验证未触发

html - 为提交、取消、删除、操作等做 html 按钮的正确方法是什么?

javascript - Web 框架为程序员提供什么帮助?

javascript - Ember 发布独特的 Assets 文件名以保证 CDN 新鲜度?

javascript - 如何在不将 div 呈现到页面的情况下获取正确的 height 属性?

javascript - 使用语音识别填写 Web 表单

javascript - Handlebars 模板和动态图像