如何将附加变量传递到Underscores模板中

4

我是一位骨干视图,使用下划线模板来呈现搜索结果。由于我想要在结果中突出显示搜索词,所以我在模板中使用了以下的打印方法:

print(someKey.replace(searchTerm, '<b>' + searchTerm + '</b>')

功能正常,但我必须在全局命名空间中设置searchTerm变量才能使其工作。我想知道是否有一种方法可以在打印方法中访问我的视图模型,这样我就可以像这样编写:

print(someKey.replace(searchTerm, '<b>' + this.model.get('searchTerm') + '</b>')

如果我可以在render函数中设置searchTerm作为本地变量,并在模板中访问它。

以下是整个Backbone视图:

var searchTerm;
var SearchResultView = Backbone.View.extend({
    initialize: function() {
        this.model.bind('change:rows', this.render, this);
        this.model.bind('change:searchTerm', this.clear, this)
    },
    template: _.template("<tr><td><% print(someKey.replace(searchTerm, '<b>' + searchTerm + '</b>')); %></td></tr>", this),
    render: function() {
       searchTerm = this.model.get('searchTerm')
        _.each(this.model.get('rows'), function(row) {
            this.el.append($(this.template(row.doc)));
        }, this)
    },
    clear: function(){
        this.el.empty();
    }
});
1个回答

8
我不确定我完全理解你的问题。但是我会类似这样做,将多个对象传递到我的模板函数中。
 $(this.el).html(_.template(html)($.extend({}, this.model.toJSON(), App.lists.toJSON())))

jquery的extend函数可以将两个对象合并为一个。因此,在您的情况下,您可以在模板化期间将您的“searchTerm”与您的模型合并在一起。
_.template(html)($.extend({}, row.doc, {"searchTerm": searchTerm}))

你的另一个选择是将整个模型传递到模板函数中,在模板中执行下划线迭代。如果需要更多解释,请告诉我。
编辑:
这里是一个jquery extend的链接。
如果你没有使用jquery,underscore也有extend方法
再次编辑:
这只是给你展示我的第二个建议的一个例子。可能需要一些调整才能放入你的代码中,但这就是基本思路。
template: _.template("

    <% _(rows).each(function(row) { %>
        <tr><td><% print(someKey.replace(searchTerm, '<b>' + searchTerm + '</b>')); %></td></tr>
<% } %>

"),
render: function(){
    this.el.append(this.template(this.model.toJSON()));
}

合并新对象到我的结果似乎有点过度,但是经过思考,除了使用全局变量或将模板内联到函数中并在那里声明searchTerm变量之外,这似乎是唯一的解决问题的方法。 - Andreas Köberle
我同意这是一个非常奇怪的情况。你基本上是从你的模型中提取“searchTerm”,迭代你的模型集合,然后将“searchTerm”重新绑定到集合中的每个项目。你可以将整个模型绑定到模板中,而不是将其拆分。然后在模板中使用_.each()包装你的html。这只是个人偏好。祝你的项目好运:D - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接