Backbone.js 使用模板

前面一篇 Backbone.js HelloWorld,应用起步 只是让 Backbone 跑起来,实际的应用中会使用到模板,Model 等,而模板又是进阶的基础。所以这里介绍在 View 中使用模板,以及如何向模板填充值,模板可以用字符串,或是用 <script type="text/template"> 声明的内容。使用 <%= %><%- %> 来声明变量输出的占位符。


Backbone 的模板要用到的是 underscore.js 库, 要深入了解 Unserscore 就看官方的 Underscore.js 的文档,Underscore 的 template 方法的原型如下:
_.template(templateString, [data], [settings])
下面是些完整的例子

一: 使用字符串模板

 1<!DOCTYPE html>
 2<html>
 3     <head>
 4         <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
 5         <script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.2/underscore-min.js"></script>
 6         <script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min.js"></script>
 7     </head>
 8     <body>
 9         <div id="container">Loading...</div>
10     </body>
11 </html>
12 
13 <script>
14    var AppView = Backbone.View.extend({
15        el: '#container',
16        template: _.template("<h3>Hello <%= who %></h3>"),
17        //上行可写成 template: _.template("<h3>Hello <%- who %></h3>", {who: 'World!'}), // :1
18        initialize: function(options) {
19            this.render();
20        },
21        render: function() {
22            this.$el.html(this.template({who: 'World!'}));
23            //前面开启的是 :1 标识的代码,这里就写成 this.$el.html(this.template);
24        }
25    });
26
27    setTimeout(function(){
28        var appView = new AppView();
29    }, 1000);
30</script>

为突出效果,把 new AppView() 放到了 setTimeout() 延迟执行,项目中没必要这么做。

点击 http://fiddle.jshell.net/Unmi/A7MK7/ 看上面代码执行的效果,可以看到 Loading ... 在 1 秒后被替换成了 Hello World!

另外,如果前面声明 View 时没有对 el 赋值,可以在实例化 AppView 时指定 el 属性,像下面那样使用
new AppView({el: $("#container")})

二. 加载模板

可以加载页面中用 <script type="text/template"> 包含的内容作为模板,它本身不会在页面中显示 出来的。下面是用 jQuery 的选择器来定位这个模板声明,html() 取出其中的内容。完整代码如下:

 1<!DOCTYPE html>
 2<html>
 3     <head>
 4         <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
 5         <script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.2/underscore-min.js"></script>
 6         <script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min.js"></script>
 7     </head>
 8     <body>
 9         <div id="container">Loading...</div>
10
11         <script type="text/template" id="who_template">
12            <h3>Hello <%= who %></h3>
13        </script>
14     </body>
15 </html>
16 
17 <script>
18    var AppView = Backbone.View.extend({
19        el: '#container',
20        initialize: function(options) {
21            this.render();
22        },
23        render: function() {
24            var template = _.template($("#who_template").html());
25            this.$el.html(template({who: 'Backbone!'}));
26        }
27    });
28
29    setTimeout(function(){
30        var appView = new AppView();
31    }, 1000);
32</script>

点击 http://fiddle.jshell.net/Unmi/2q6jJ/ 看执行效果,页面在一秒钟后显示 Hello Backbone!

注意,你不能直接加载页面中声明的其他元素,例如定义的
1<div id="who_template" style="display:none">
2    <h3>Hello <%= who %></h3>
3</div>

如果直接用 _template($("#who_template").html() 的话,执行后显示的就是 Hello <%= who %>。也就是说其中的变量值不会被解析,如果你的模板中无需填充值是可以这么做,但还需用 display:none 来隐藏掉它。

点击 http://fiddle.jshell.net/Unmi/4Rnzs/ 看看加载普通页面元素执行的效果。

我们还能直接在自定义 View 中使用 events 属性来定义事件,接下来我们去体验。

参考: What is a view? 永久链接 https://yanbin.blog/backbone-js-use-template/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。