View是backbone中重要的一环。第一个程序注定是从hello world开始。在开始之前,先创建一个HTML文件,在其中引用这三个JS库(注意:underscore要在backbone前面):
jquery.js
underscore.js
backbone.js
页面的内容就随意了,下面的例子要求页面中包含一个<div id="body" />节点。 然后创建一个最简单的View:
var TestView = Backbone.View.extend({ // 创建一个view,其实就是一个HTML的DOM节点
initialize: function() {
this.render();
},
render: function() { // 渲染方法
this.$el.html('Hello World'); // this.el就是HTML节点,通过jQuery的html方法填充内容
return this;
}
});
$(function () {
var v = new TestView({el: $('#body')}); // 以目标节点(一个 <div id="body" />)为el参数,创建一个view的实例,render函数将会被自动调用并将渲染结果填充到el中
//v.render(); // 如果没在 initialize 里调用 render 的话,就需要在这里调用一次
});
试一个简单的效果:点击隐藏。把上面的View改成这样:
var TestView = Backbone.View.extend({
events: {
'click button#toggle' : 'toggle' // 响应toggle button的click事件
},
initialize: function() {
this.render();
},
render: function() {
this.$el.html('<p id="hello">Hello World</p><button id="toggle">Toggle</button>'); // 增加一个toggle button
return this;
},
toggle: function() {
$("#hello").toggle(); // 用jQuery的toggle方法切换显示
return this;
}
});
注意,如果 events 里用的是非唯一的绑定,可以通过以下方式取得发生事件的对象: // … ‘click button.show’: ‘showItem’ // … showItem: function (e) { alert($(e.currentTarget)); }
代码里嵌入HTML是很麻烦的事情,所以模板是需要的。理论上可以在backbone里使用任何JavaScript模板,这里以underscore自带的template为例。先按模板的语法在HTML文件里写一个模板:
<script type="text/template" id="hello-template">
<div>
<h3 id="hello">${message}</h3>
<button id="toggle">Toggle</button>
</div>
</script>
为了不影响页面的正常显示,JS模板通常都是放在 text/template 类型的 script 标签里。 注意,因为习惯的问题,模板里的变量标记没有使用默认的<%= %>,而是改成和python mako里一样的 ${ },为此需要修改underscore的模板设置如下:
_.templateSettings = {
interpolate : /\$\{(.+?)\}/g
};
而显示模板的方法如下:
var TestView = Backbone.View.extend({
template: null, // 把模板直接放这里有时也可以,但有时又会出错,还不知道是什么原因
events: {
'click button#toggle' : 'toggle'
},
initialize: function() {
this.template = _.template($("#hello-template").html()); // 模板放这里一般没问题
this.render();
},
render: function() {
this.$el.html(this.template({message: "hello world!"})); // 渲染模板
return this;
},
toggle: function() {
this.$("#hello").toggle();
return this;
}
});