backbone.js 下划线模板:将变量从父模板传递到子模板

35g0bw71  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(149)

我有一个下划线模板,大致如下所示:

<script type="text/template" id="list-template">
    <%= listHeaderTemplate(); %>
    stuff that
    displays a list
    <%= listFooterTemplate(); %>
</script>

<script type="text/template" id="list-footer-template">
    <%= foo %>
</script>

<script>
listTemplate = _.template($("#list-template").html());
listHeaderTemplate = _.template($("#list-header-template").html());
listFooterTemplate = _.template($("#list-footer-template").html());
</script>

我想做的是将传递给listTemplate()的完整变量集传递给listFooterTemplate()。

listTemplate({foo: "foo"});

我可以通过修改list-template中对listHeaderTemplate()/ listFooterTemplate()的调用来实现这一点,以便将局部变量打包到一个字典中(即listFooterTemplate({foo:foo});)但这似乎相当麻烦,尤其是在使用大量变量的情况下,它要求我知道list-template内部list-footer-template可能使用哪些变量。

lf5gs5x2

lf5gs5x21#

编译Underscore模板时,Underscore会将模板翻过来,并构建一个函数,大致如下所示:

function(obj) {
    // Some set up...
    with(obj || {}) {
        // The template as JavaScript...
    }
    return theTemplateText;
}

你不能依赖于被调用的参数obj,它迟早会被破坏。但是你应该安全地访问arguments对象。有了arguments,你就可以用和当前函数完全相同的参数来调用其他函数,而不必知道参数是什么,你只需要使用apply
如果您的模板有listHeaderTemplatelistFooterTemplate可用,您可以简单地说:

<script type="text/template" id="list-template">
    <%= listHeaderTemplate.apply(this, arguments) %>
    stuff that
    displays a list
    <%= listFooterTemplate.apply(this, arguments) %>
</script>

一种简单的方法是将这些函数作为参数传递给模板:

var listTemplate       = _.template($("#list-template").html());
var listHeaderTemplate = _.template($("#list-header-template").html());
var listFooterTemplate = _.template($("#list-footer-template").html());

var html = listTemplate({
    foo: 11,
    listHeaderTemplate: listHeaderTemplate,
    listFooterTemplate: listFooterTemplate
});

演示:http://jsfiddle.net/ambiguous/vwjm1kta/

tmb3ates

tmb3ates2#

或者,可以通过JSON.stringify和HTML data-* 属性传递数据对象。

<script type="text/template" id="list-template">
<div id="my-list-template" data-us-tmpl-data="<%= JSON.stringify(data) %>">
</div>
</script>

相关问题