我们在上一个视频中介绍了使用 Handlebars 进行模板化。但 Handlebars 不是唯一可用的模板化解决方案。在本视频中,我们将使用 Underscore 中提供的模板化功能。
为什么?一个原因是您可能已经在项目中使用 Underscore 了。它是一个非常流行的库,因为它像 jQuery 一样,提供了许多跨浏览器工作的有用方法。正如他们所说
它是 jQuery 的燕尾服和 Backbone.js 的背带的搭配。
如果您已经在使用 Underscore,那么这将是使用其模板化功能的一个重要诱因。
此外,在我快速测试中,Handlebars 1.0.0 压缩并最小化后为 14.2 KB,而 Underscore 压缩并最小化后为 4.9 KB。Handlebars 拥有更多功能(例如注释、循环、路径、逻辑等)。在我们简单的演示中,我们根本不需要这些功能,所以这不是一个完全公平的比较,但无论如何我们只是在学习。
与其在 HTML 中使用模板,我们需要在 JavaScript 中定义 Underscore 模板。我们又回到了字符串连接。
var compiled = _.template(
"<div class='module module-movie' style='background-image: url(<%= movieImage %>)'>" +
"<div class='movie-info'>" +
"<h3 class='movie-title'>" +
"<%= movieTitle %>" +
"</h3>" +
"<p class='movie-director'>" +
"<%= movieDirector %>" +
"</p>" +
"</div>" +
"</div>"
);
compiled
然后变成了一个我们可以使用数据对象上下文调用的函数,并返回用这些数据填充的所有 HTML。为了提高效率,我们将返回的 HTML 连接成一个大的字符串,以便我们可以只将其附加到 DOM 一次
var i, html = "";
for (i = 0; i < data.movies.length; i++) {
html += compiled(data.movies[i]);
}
$("#movies").append(html);
在本视频中,我们还抽象了获取数据的方式。我们创建了一个 JSON 源,并使用 jQuery 的 $.getJSON() 函数来获取它。就像我们可能在“现实生活中”需要做的那样。
$.getJSON("/path/to/json.js", function(data) {
});
我们依赖该数据的 for 循环等代码放在那里的回调函数中。或者更有可能的是,调用一些其他命名良好的函数来处理它,从而保持代码的清晰分离。
这是我们最终得到的结果
查看 Chris Coyier 在 CodePen 上的笔 IpAdn (@chriscoyier)
需要注意的是,LoDash 与我们在这里所做的完全兼容。我不确定 LoDash 模板化是否比 Underscore 的更好/更快/更慢/更差,但我交换了库,演示也正常工作。