【问题标题】:Using external composite jQuery Templates使用外部复合 jQuery 模板
【发布时间】:2011-05-17 23:19:31
【问题描述】:

在受到这 2 篇博文的启发后,我想尝试 jQuery 模板

嗯,这对我来说不太有效。如果我在页面本身上有模板代码,它可以正常工作,但远程加载对我不起作用。似乎正在检索模板。这里有什么问题?

外部模板:

<script id="contactsTemplate" type="text/x-jquery-tmpl">
  <table class="contacts">
    <thead><tr><td class="ui-helper-hidden">Id</td><td>Name</td><td>City</td><td>State</td></tr></thead>
    <tbody>
    {{each contact}}
        {{tmpl($value) '#contactTemplate'}}
    {{/each}}
    </tbody>
  </table>
</script>

<script id="contactTemplate" type="text/x-jquery-tmpl">
    <tr><td class="ui-helper-hidden">${id}</td><td>${name}</td><td>${city}</td><td>${state}</td></tr>
</script>

在我的页面上,我使用此代码来检索和加载模板:

var contacts = {
    contact: [
        { id: 1, name: "John Green", city: "Orange Beach", state: "AL" },
        { id: 2, name: "Sam Thompson", city: "Pensacola", state: "FL" },
        { id: 3, name: "Mary Stein", city: "Mobile", state: "AL" }
    ]
};

$("#ShowDataRemote").button().click(function() {
    $.get('templates/Contact.htm', function(template) {
        alert(template);
        $.tmpl(template, contacts).appendTo("body");
        alert("async done");
    });
});

更新:

Encosia 上的一篇新博文解释了这个问题和答案...

http://encosia.com/2010/12/02/jquery-templates-composite-rendering-and-remote-loading/

【问题讨论】:

    标签: jquery jquery-templates


    【解决方案1】:

    这种简单的远程加载技术不适用于复合模板,因为您要加载的字符串本身不是有效的模板。你可以通过改变你的点击处理程序来让它工作:

    $("#ShowDataRemote").button().click(function() {
      $.get('templates/Contact.htm', function(template) {
        // Inject the template script blocks into the page.
        $('body').append(template);
    
        // Use those templates to render the data.
        $('#contactsTemplate').tmpl(contacts).appendTo("body");
      });
    });
    

    【讨论】:

    • 为什么用$.get()获取的模板无效,但是在本地可以正常工作?
    • 因为它是两个独立的模板,包括非模板的 x-jquery-tmpl 脚本标记。 .tmpl(template, data) 用法仅适用于您为其提供模板字符串且仅此而已。
    • 我知道我尝试了这种解决方法,但它对我不起作用。我一定是出了什么问题,因为它现在可以工作了。谢谢!
    • 我专门写了一篇关于这个组合的新帖子,如果你有兴趣的话:encosia.com/2010/12/02/…
    • 我知道。我猜你错过了,但我更新了这个问题,并提供了一个指向你关于此的新帖子的链接。感谢您的文章!
    【解决方案2】:

    您可以将模板字符串编译为“命名模板”,如以下参考:https://stackoverflow.com/a/4366280/1274343

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多